Bir aralığa (tek bir ifadede) bir sayının dahil edilip edilmediği nasıl kontrol edilir?


86

Ruby on Rails 3.0.9 kullanıyorum ve bir aralığa bir sayı dahil olup olmadığını kontrol etmek istiyorum. Yani, eğer bir değişkenim varsa, değer o aralıkta yer alıyorsa bir boole değerini number = 5kontrol etmek 1 <= number <= 10ve almak isterim number.

Bunu şu şekilde yapabilirim:

number >= 1 && number <= 10

ama bunu tek bir açıklamayla yapmak isterim. Bunu nasıl yapabilirim?


Alıntı yaptığınız ifadede yanlış bir şey olmadığına göre, şu soru soruluyor: neden onu daha fazla "kısaltmak" istiyor / buna ihtiyacın var?
DarkDust

1
@DarkDust - Mümkün olduğu kadar az kod!
Backo

Yanıtlar:


163

(1..10).include?(number) hiledir.

Btw: Bir numarayı kullanarak doğrulamak istiyorsanız ActiveModel::Validations, şunları bile yapabilirsiniz:

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

validates_inclusion_of hakkında burayı okuyun

veya Rails 3+ yolu:

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

Ya sıfıra da izin vermek istersem? Sıfır olduğunda bir hata alıyorum.
user2503775

5
Rayların bir seçeneği vardır allow_nil. Sadece şöyle ekleyin:, allow_nil: true
Mario Uher

65

Numaralandırılabilir # dahil? :

(1..10).include? n

Aralık kapağı? :

(1..10).cover? n

Karşılaştırılabilir # arasında? :

n.between? 1, 10

Sayısallık Doğrulayıcı :

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

Dahil Etme Doğrulayıcı :

validates :n, inclusion: 1..10

1
Bu yöntemi daha çok seviyorum çünkü doğrulama metni daha mantıklı.
Dan

Bunu daha çok seviyorum çünkü zaten doğrulama sayısallığıydım. Tek satırlık yapıyor :)
BradGreens

@BradGreens bu uzun bir çizgi.
wchargin

1
Belirli bir mantığa veya ilişkilendirmelere erişime ihtiyacınız varsa proc'u kullanabileceğinizi belirtmek isterim. Örneğinvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
ülkesi Масленков

16

Bir doğrulama sürecinin parçası değilse şunları kullanabilirsiniz #between?:

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

7

Bir form gönderiminde doğru hata mesajları için şunları deneyin

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

3

Raylar 4

ActiveModel :: Validations aracılığıyla isterseniz kullanabilirsiniz

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

veya Rails 3 sözdizimi

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

Ama bulduğum en basit yol

number.between? start_number, end_number


Belki bir açıklama ekleyin.
GMchris

2

Ruby 1.9'da en doğrudan çeviri Range # cover? :

Obj, beg ile end arasındaysa, yani beg <= obj <= end (veya excde_end? True olduğunda end exclusive) döndürür.

Bunun nasıl farklı olduğunu merak ediyorsanız Range#include?, ikincisi sayısal olmayan bir aralıksa aralığın tüm öğeleri üzerinde yineleniyor olmasıdır. Daha ayrıntılı bir açıklama için bu blog gönderisine bakın .


1

Özel dizide belirli bir sayının var olup olmadığını kontrol etmek isterseniz,

Örneğin, 5'in listeye = [1,4,6,10] dahil edilip edilmediğini bilmek istiyorum

list.include? 5 => false
list.include? 6 => true
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.