Wie überprüfe ich, ob eine Zahl in einem Bereich enthalten ist (in einer Anweisung)?

84

Ich verwende Ruby on Rails 3.0.9 und möchte prüfen, ob eine Nummer in einem Bereich enthalten ist. Das heißt, wenn ich eine Variable number = 5habe, möchte ich 1 <= number <= 10einen booleschen Wert überprüfen und abrufen, wenn der numberWert in diesem Bereich enthalten ist.

Ich kann das so machen:

number >= 1 && number <= 10

aber ich möchte das in einer Aussage tun. Wie kann ich das machen?

Backo
quelle
Da an Ihrer zitierten Aussage nichts auszusetzen ist, stellt sich die Frage: Warum wollen / müssen Sie sie weiter "verkürzen"?
DarkDust
1
@ DarkDust - Weniger Code so gut wie möglich!
Backo

Antworten:

158

(1..10).include?(number) ist der Trick.

Übrigens: Wenn Sie eine Nummer mit validieren möchten ActiveModel::Validations, können Sie sogar Folgendes tun:

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

Lesen Sie hier über validates_inclusion_of

oder der Rails 3+ Weg:

validates :number, :inclusion => 1..10
Mario Uher
quelle
Was ist, wenn ich auch Null zulassen möchte? Ich erhalte eine Fehlermeldung, wenn es Null ist.
user2503775
5
Schienen hat eine Option allow_nil. Fügen Sie es einfach so hinzu:, allow_nil: true
Mario Uher
63

Aufzählbare # enthalten? ::

(1..10).include? n

Bereich # Abdeckung? ::

(1..10).cover? n

Vergleichbare # zwischen?::

n.between? 1, 10

Numericality Validator :

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

Einschlussvalidator :

validates :n, inclusion: 1..10
tybro0103
quelle
1
Diese Methode gefällt mir besser, weil der Validierungstext sinnvoller ist.
Dan
Ich mag es besser, weil ich bereits Validierungsnummer war. Macht es einzeilig :)
BradGreens
@BradGreens das ist eine lange Schlange.
Charchargin
1
Ich möchte darauf hinweisen, dass Sie proc verwenden können, wenn Sie eine bestimmte Logik oder Zugriff auf Assoziationen benötigen. Zum Beispielvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков
16

Wenn es nicht Teil eines Validierungsprozesses ist, können Sie Folgendes verwenden #between?:

2.between?(1, 4)
=> true
Holin
quelle
5

Versuchen Sie diese, um genaue Fehlermeldungen in einem Formular zu erhalten

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 1, message: 'must be between 0 & 100'
Jon
quelle
3

Schienen 4

Wenn Sie es über ActiveModel :: Validations möchten, können Sie es verwenden

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

oder die Rails 3-Syntax

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

Aber der einfachste Weg, den ich finde, ist

number.between? start_number, end_number

Sudhir Vishwakarma
quelle
Vielleicht eine Erklärung hinzufügen.
GMchris
2

In Ruby 1.9 scheint die direkteste Übersetzung Range # cover zu sein? ::

Gibt true zurück, wenn obj zwischen beg und end liegt, dh beg <= obj <= end (oder end exklusiv, wenn exclude_end? True ist).

Range#include?Wenn Sie sich fragen, wie sich das unterscheidet , iteriert letzteres über alle Elemente des Bereichs, wenn es sich um einen nicht numerischen Bereich handelt. In diesem Blog-Beitrag finden Sie eine ausführlichere Erklärung.

Michael Kohl
quelle
1

Wenn Sie überprüfen möchten, ob eine bestimmte Nummer im benutzerdefinierten Array vorhanden ist,

Zum Beispiel möchte ich wissen, ob 5 in list = [1,4,6,10] enthalten ist oder nicht

list.include? 5 => false
list.include? 6 => true
Lakhani Aliraza
quelle