¿Cómo verificar si un número está incluido en un rango (en una declaración)?

85

Estoy usando Ruby on Rails 3.0.9 y me gustaría comprobar si un número está incluido en un rango. Es decir, si tengo una variablenumber = 5 me gustaría verificar 1 <= number <= 10y recuperar un valor booleano si el numbervalor está incluido en ese rango.

Puedo hacer eso así:

number >= 1 && number <= 10

pero me gustaría hacer eso en una declaración. ¿Cómo puedo hacer eso?

Backo
fuente
Dado que no hay nada de malo en su declaración citada, surge la pregunta: ¿por qué quiere / necesita "acortarla" aún más?
DarkDust
1
@DarkDust - ¡Menos código lo mejor posible!
Backo

Respuestas:

161

(1..10).include?(number) es el truco.

Por cierto: si desea validar un número usando ActiveModel::Validations, incluso puede hacer:

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

leer aquí sobre validates_inclusion_of

o la forma Rails 3+:

validates :number, :inclusion => 1..10
Mario Uher
fuente
¿Qué pasa si también quiero permitir cero? Recibo un error cuando es nulo.
user2503775
5
Rails tiene una opción allow_nil. Solo agrégalo así:, allow_nil: true
Mario Uher
64

Enumerable # incluir? :

(1..10).include? n

¿Cobertura de rango #? :

(1..10).cover? n

Comparable # entre? :

n.between? 1, 10

Validador de numericalidad :

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

Validador de inclusión :

validates :n, inclusion: 1..10
tybro0103
fuente
1
Me gusta más este método, porque el texto de validación tiene más sentido.
Dan
Me gusta más porque ya estaba validando la numericalidad. Lo convierte en una sola línea :)
BradGreens
@BradGreens eso es una larga fila.
wchargin
1
Quiero señalar que puede usar proc si necesita alguna lógica específica o acceso a asociaciones. Por ejemplovalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
Евгений Масленков
16

Si no es parte de un proceso de validación, puede usar #between?:

2.between?(1, 4)
=> true
Holin
fuente
6

Para obtener mensajes de error precisos en el envío de un formulario, pruebe estos

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

Carriles 4

si lo desea a través de ActiveModel :: Validations puede usar

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

o la sintaxis de Rails 3

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

Pero la forma más sencilla que encuentro es

number.between? start_number, end_number

Sudhir Vishwakarma
fuente
Quizás incluya alguna explicación.
GMchris
2

En Ruby 1.9, la traducción más directa parece ser Range # cover? :

Devuelve verdadero si obj está entre beg y end, es decir, beg <= obj <= end (o final exclusivo cuando exclude_end? Es verdadero).

En caso de que se pregunte en qué se diferencia de Range#include?, es que este último itera sobre todos los elementos del rango si es un rango no numérico. Consulte esta publicación de blog para obtener una explicación más detallada.

Michael Kohl
fuente
1

Si desea verificar que un número particular existe en una matriz personalizada,

Como por ejemplo, quiero saber si 5 está incluido en la lista = [1,4,6,10] o no

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