szyn 2
find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])
nie jest właściwa składnia przechodzącej skrótów sposobu. Możesz zostawić nawiasy klamrowe z skrótu, jeśli jest to ostatni argument metody, ale w tym przypadku przekazujesz tablicę jako ostatni argument.
Użyj następującego zamiast:
find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1])
lub
params = {:search => "%#{search}%", :active => 1}
find(:all, :conditions => ["name LIKE :search AND active = :active", params])
Szyny 3 i 4
Pewnie można chcieć zrobić coś więcej jak poniżej dla najnowszych wersji Rails:
scope :active, -> { where(active: true) }
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") }
A potem by nazwać tak:
YourModel.active.name_like("Bunnies")
To pozwala na ponowne użycie tych konkretnych zapytań w różnych kombinacjach w całej aplikacji. Dzięki temu kod odczytujący dane jest bardzo łatwy do odczytania.
Jeśli nie podoba składni scope
, można również zdefiniować je jako metody klasy:
def self.active
where(active: true)
end
def self.name_like(search)
where("name LIKE ?", "%#{search}%")
end
można również zakresy łańcuch na bieżąco. Umożliwi to rozpoczęcie budowania łańcucha obiektów relacji, a następnie włączenie innych w zależności od warunków.Oto, co to może wyglądać, gdy zastosowane do pierwotnego pytania, aby osiągnąć takie same wyniki:
results = active
results = results.name_like(search) if search.present?
Dziękuję bardzo! Twój drugi przykład pracował dla mnie (nie próbował pierwszego - drugi wygląda jak fajny sposób na dodanie dowolnej liczby warunków, więc nie muszę się martwić o ich kolejność tak bardzo). –