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?


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

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

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

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'

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.