rotaie 2
find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])
non è la sintassi corretta per il passaggio hash a un metodo. Puoi lasciare le parentesi graffe fuori da un hash se è l'ultimo argomento di un metodo, ma in questo caso stai passando un array come ultimo argomento.
Utilizza il seguente invece:
find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1])
o
params = {:search => "%#{search}%", :active => 1}
find(:all, :conditions => ["name LIKE :search AND active = :active", params])
Rails 3 e 4
si sarebbe probabilmente vuole fare qualcosa di più simile al seguente per le versioni Rails recenti:
scope :active, -> { where(active: true) }
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") }
E poi si definirebbe così:
YourModel.active.name_like("Bunnies")
che permette di riutilizzare tali query specifiche in diverse combinazioni in tutta l'applicazione. Rende anche il codice che recupera i dati super facile da leggere.
Se non ti piace la sintassi scope
, è anche possibile definire queste come metodi di classe:
def self.active
where(active: true)
end
def self.name_like(search)
where("name LIKE ?", "%#{search}%")
end
si può anche ambiti di catena al volo. Ciò ti consentirà di iniziare a costruire una catena di oggetti relazionali e poi scegliere di includerne altri in base alle condizioni.Ecco quello che potrebbe apparire come se applicato alla domanda iniziale per ottenere gli stessi risultati:
results = active
results = results.name_like(search) if search.present?
Grazie mille! Il tuo secondo esempio ha funzionato per me (non ho provato il primo - il secondo sembra un bel modo per aggiungere un numero qualsiasi di condizioni in modo da non dovermi preoccupare del loro ordine così tanto). –