2011-07-30 40 views
61

Estoy usando Ruby on Rails 3.0.9 y me gustaría comprobar si se incluye un número en un rango. Es decir, si tengo una variable number = 5 me gustaría verificar 1 <= number <= 10 y recuperar un valor booleano si el valor number está incluido en ese rango.¿Cómo verificar si un número está incluido en un rango (en una declaración)?

que pueda hacer eso así:

number >= 1 && number <= 10 

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

+0

Dado que no hay nada malo con su declaración citada se plantea la pregunta: ¿por qué quiere/necesita más "acortarlo"? – DarkDust

+1

@DarkDust - ¡Menos código lo mejor posible! – Backo

Respuesta

128

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

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

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

leer here sobre validates_inclusion_of

o los carriles de 3 vías:

validates :number, :inclusion => 1..10 
+0

¿Qué sucede si también quiero permitir nada? Me sale un error cuando es nulo. – user2503775

+4

Rails tiene la opción 'allow_nil'. Simplemente agréguela de la siguiente manera: ', allow_nil: true' –

+0

¿Funciona para números negativos? –

13

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

2.between?(1, 4) 
=> true 
45

Enumerable#include?:

(1..10).include? n 

Range#cover?:

(1..10).cover? n 

Comparable#between?:

n.between? 1, 10 

Numericality Validator:

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

Inclusion Validator:

validates :n, inclusion: 1..10 
+1

Me gusta mejor este método, porque el texto de validación tiene más sentido. – Dan

+0

Me gusta más porque ya tenía validez numérica. Lo convierte en una sola línea :) – BradGreens

+0

@BradGreens esa es una larga lista. – wchargin

2

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

devuelve verdadero si obj es entre BEG y al final, es decir, pedir < = obj < = fin (o final exclusivo cuando exclude_end? es verdad).

En caso que quiera saber cómo es diferente de Range#include?, es que este último itera sobre todos los elementos del rango si se trata de un rango no numérico. Vea esto blog post para una explicación más detallada.

2

Carriles 4

si quieres que a través ActiveModel :: validaciones puede utilizar

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

o los carriles 3 sintaxis

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

Pero El simpl est manera que encuentro es

number.between? start_number, end_number

+0

Quizás incluya alguna explicación. – GMchris

2

Para los mensajes de error exactos sobre un formulario de envío, pruebe estos

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 1, message: 'must be between 0 & 100' 
Cuestiones relacionadas