Jak sprawdzić, czy liczba znajduje się w zakresie (w jednym wyciągu)?

85

Używam Ruby on Rails 3.0.9 i chciałbym sprawdzić, czy liczba znajduje się w zakresie. Oznacza to, że jeśli mam zmienną number = 5, chciałbym sprawdzić 1 <= number <= 10i pobrać wartość logiczną, jeśli numberwartość znajduje się w tym zakresie.

Mogę to zrobić w ten sposób:

number >= 1 && number <= 10

ale chciałbym to zrobić w jednym oświadczeniu. Jak mogę to zrobić?

Backo
źródło
Ponieważ nie ma nic złego w twoim cytowanym stwierdzeniu, nasuwa się pytanie: dlaczego chcesz / musisz dalej „skracać” je?
DarkDust
1
@DarkDust - mniej kodu tak dobrze, jak to możliwe!
Backo

Odpowiedzi:

161

(1..10).include?(number) jest sztuczka.

Btw: Jeśli chcesz zweryfikować numer za pomocą ActiveModel::Validations, możesz nawet zrobić:

validates_inclusion_of :number, :in => 1..10

przeczytaj tutaj o validates_inclusion_of

lub sposób Rails 3+:

validates :number, :inclusion => 1..10
Mario Uher
źródło
A jeśli chcę również zezwolić na zero? Otrzymuję błąd, gdy jest zerowy.
user2503775
5
Rails ma opcję allow_nil. Po prostu dodaj to tak:, allow_nil: true
Mario Uher
65

Enumerable # include? :

(1..10).include? n

Zakres # obejmuje? :

(1..10).cover? n

Porównywalne # między? :

n.between? 1, 10

Walidator liczbowości :

validates :n, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 10}

Weryfikator włączenia :

validates :n, inclusion: 1..10
tybro0103
źródło
1
Bardziej podoba mi się ta metoda, ponieważ tekst walidacji ma więcej sensu.
Dan
Podoba mi się to bardziej, ponieważ byłem już numeryczny walidacji. Sprawia, że ​​jest to
jednowierszowe
@BradGreens to jedna długa linia.
wchargin
1
Chcę zauważyć, że możesz użyć proc, jeśli potrzebujesz określonej logiki lub dostępu do skojarzeń. Na przykładvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков
16

Jeśli nie jest to część procesu walidacji, możesz użyć #between?:

2.between?(1, 4)
=> true
Holin
źródło
6

Aby uzyskać dokładne komunikaty o błędach w przesyłanym formularzu, wypróbuj te

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 100, message: 'must be between 0 & 100'
Jon
źródło
3

Szyny 4

jeśli chcesz to przez ActiveModel :: Validations, możesz użyć

validates_inclusion_of :number, :in => start_number..end_number

lub składnia Rails 3

validates :number, :inclusion => start_number..end_number

Ale najprostszy sposób, jaki znalazłem, to

number.between? start_number, end_number

Sudhir Vishwakarma
źródło
Być może zawiera jakieś wyjaśnienie.
GMchris
2

W Rubim 1.9 najbardziej bezpośrednim tłumaczeniem wydaje się być okładka Range #? :

Zwraca prawdę, jeśli obj znajduje się między początkiem a końcem, tj. Beg <= obj <= koniec (lub koniec wyłączny, gdy exclude_end? Ma wartość true).

Jeśli zastanawiasz się, czym to się różni Range#include?, polega na tym, że ten ostatni iteruje po wszystkich elementach zakresu, jeśli jest to zakres nieliczbowy. Zobacz ten wpis na blogu, aby uzyskać bardziej szczegółowe wyjaśnienie.

Michael Kohl
źródło
1

Jeśli chcesz sprawdzić, czy konkretna liczba istnieje w niestandardowej tablicy,

Na przykład chcę wiedzieć, czy na liście jest 5 = [1,4,6,10], czy nie

list.include? 5 => false
list.include? 6 => true
Lakhani Aliraza
źródło