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?
Ç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). –