2011-07-30 38 views
61

我正在使用Ruby on Rails 3.0.9,我想检查一个数字是否包含在一个范围内。也就是说,如果我有一个变量number = 5我想检查1 <= number <= 10并检索一个布尔值,如果number值包括在该范围内。如何检查一个数字是否包含在一个范围内(在一个语句中)?

我是这样做的:

number >= 1 && number <= 10 

,但我想这样做,在一个声明。我怎样才能做到这一点?

+0

由于没有什么不对您引用的语句它引出了一个问题:为什么想/需要进一步“缩短”呢? – DarkDust

+1

@DarkDust - 尽可能少的代码! – Backo

回答

128

(1..10).include?(number)是诀窍。

顺便说一句:如果你想验证使用ActiveModel::Validations一个数字,你甚至可以这样做:

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

阅读here约validates_inclusion_of

或Rails的3路:

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

如果我还想允许零,该怎么办?当它为零时,我收到一个错误。 – user2503775

+4

Rails有一个选项'allow_nil'。只需添加它就像这样:',allow_nil:true' –

+0

它是否适用于负数? –

13

如果它不是验证过程的一部分,您可以使用#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

我更喜欢这种方法,因为验证文本更有意义。 – Dan

+0

我更喜欢它,因为我已经验证了数字性。使它成为一行:) – BradGreens

+0

@BradGreens这是一条长长的路线。 – wchargin

2

在Ruby 1.9的最直接的翻译似乎是Range#cover?

返回true如果obj是乞讨和结束之间,即求< = OBJ < =结束(或者在排除结束时排除 结束排除?是真的)。

如果你想知道那是来自Range#include?不同,那就是,如果它是在范围内的所有元素,后者迭代非数值范围。有关更详细的解释,请参阅此blog post

2

轨道4

,如果你想通过它加载ActiveModel ::验证您可以使用

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

或Rails 3的语法

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

但简单EST方式我觉得是

number.between? start_number, end_number

+0

也许包含一些解释。 – GMchris

2

窗体上精确的错误信息提交,请尝试这些

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 1, message: 'must be between 0 & 100' 
相关问题