2013-05-23 25 views
11

Bu, Ruby sözdizimi şeylerinden çok daha fazlası olabilir. Bir SomeObject.find giden iki sınırlayıcı koşul almakta zorluk çekiyorum. Ne ilk durum için gidiyorum budurRaylar ActiveRecord: Bulunan birden fazla koşul

if search != '' 
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
else 
    find(:all, :conditions => ['active', 1]).shuffle 
end 

:

Ayrılmış

, koşullar çalışmıyor gibi görünüyor

find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1]) 

Ama çizgi syntax error, unexpected ')', expecting tASSOC atar. active = 1 kontrol ettiğiniz için elinizde fazladan yer alacağı Yerine if-else kullanmanın

cevap

16

raylar 2

find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1]) bir yöntem ile karma geçirmek için uygun sözdizimi değildir. Bir yöntemin son argümanıysa, kaşlı ayraçları bir karmadan ayırabilirsiniz, ancak bu durumda bir diziyi son argüman olarak geçirirsiniz.

Kullanım yerine aşağıdaki:

find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1]) 

veya

params = {:search => "%#{search}%", :active => 1} 
find(:all, :conditions => ["name LIKE :search AND active = :active", params]) 

Raylar 3 ve 4

Muhtemelen daha yeni Raylar sürümleri için aşağıdaki gibi bir şey yapmak isteyeyim:

scope :active, -> { where(active: true) } 
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") } 

Ve sonra böyle derdim: Eğer uygulama boyunca farklı kombinasyonlarda bu belirli sorguları yeniden kullanıma izin veren

YourModel.active.name_like("Bunnies") 

. Aynı zamanda kodun veriyi kolayca okunmasını kolay hale getirir. Eğer scope sözdizimi beğenmezseniz

, ayrıca sınıf yöntemleri gibi bu tanımlayabiliriz: anında

def self.active 
    where(active: true) 
end 

def self.name_like(search) 
    where("name LIKE ?", "%#{search}%") 
end 

yapabilirsiniz ayrıca zincir kapsamları. Bu, bir ilişki nesnesi zinciri oluşturmaya başlamanızı ve ardından başkalarını koşullara göre dahil etmeyi seçmenizi sağlayacaktır.Burada aynı sonuçları elde etmek asıl soruya uygulandığında nasıl görüneceğine var: Raylar 4 için

results = active 
results = results.name_like(search) if search.present? 
+0

Çok teşekkürler! İkinci örneğiniz benim için çalıştı (ilki denemedin - ikincisi, herhangi bir sayıdaki koşulu eklemek için gitmek için iyi bir yol gibi görünüyor, bu yüzden onları çok fazla endişelendirmeme gerek yok). –

2

, daha basit bir sözdizimi böyle bir şey olurdu:

result = where(:active => 1) 
result = result.where('name like ?', "%#{search}%") unless search.blank? 

Bildiğim kadarıyla sizin gören, kaynaklanmadığı gibi görünen olmaz hata olarak Gönderdiğiniz kodla. Bir yığın izlemesi bunu denemek raylar 2

kullanıyor bence ... daha da daraltmak

+0

Burada durdurma Evet, eğer bir nevi gereksiz olurdu, ama ben hiçbir arama dizesi girilip girilmediğini sadece sonuçları karıştırmak gibi şeyler yapmak istiyorum ve ek koşullar eklemek istiyorum/bu vakfın üstüne açıklamalar. Cevabınız için teşekkürler! –

2

yardımcı olabilir.

find(:all, :conditions => ['name LIKE ? and active = 1', "%#{search}%"]) 

raylar 3 sözdizimi

where('name LIKE ? and active = 1', "%#{search}%") 
+0

Rails 3 kullanıyorum, ancak bir 2007 eğitmeninden orijinal arama snippet'ini aldım: http://railscasts.com/episodes/37-simple-search-form –

0

, Yeni bir find_by ve find_by raylar! yöntemler

Read answer tanıtılmaktadır