Ich habe eine Reihe von Rails-Suchmethoden geschrieben, die einen optionalen Parameter verwenden, um die Genauigkeit der Suche zu definieren. Die Kern-Methode ist wie folgt:Rails ActiveRecord .where-Methode führt keine SQL-Abfrage aus
class Participant < ActiveRecord::Base
def self.matches(field_name, param, rigor = 'exact')
where("lower(#{field_name}) like ?", "#{param}") if rigor == 'exact'
where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft'
end
end
mir dieses Ergebnis zu erzielen:
[1] pry(main)> >> Participant.matches('last_name', 'Goodman', 'soft')
Participant.matches('last_name', 'Goodman', 'soft')
Participant Load (5.1ms) SELECT "participants".* FROM "participants" WHERE (lower(last_name) like '%Goodman%')
=> [#<Participant:0x007fc6fecee8d0
id: 17,
first_name: "Harris",
last_name: "Goodman",
gender: 0,
birthdate: nil,
city: nil,
state_code: "CA",
email: nil,
phone: nil,
created_at: Wed, 30 Mar 2016 11:18:33 MDT -06:00,
updated_at: Wed, 30 Mar 2016 11:18:33 MDT -06:00,
created_by: 1,
updated_by: 1,
country_code: "US",
user_id: nil>]
[2] pry(main)> >> Participant.matches('last_name', 'Goodman', 'exact')
Participant.matches('last_name', 'Goodman', 'exact')
=> nil
Rails nicht die SQL-Abfrage Brennen zu sein scheint, wenn die ‚genau‘ Parameter übergeben wird.
Ich habe auch =
anstelle von like
versucht, aber das gleiche Ergebnis erhalten. Arbeitete mehr als eine Stunde daran, ohne Erfolg. Irgendwelche Ideen wären willkommen.
EDIT: OK, also ein wenig Refactoring löst das Problem:
def self.matches(field_name, param)
where("lower(#{field_name}) like ?", "%#{param}%")
end
def self.exact_matches(field_name, param)
where("lower(#{field_name}) like ?", "#{param}")
end
ich noch wissen möchte, warum dies funktioniert, aber die elegantere Lösung früher nicht.
Ja, dies behebt das Problem. Vielen Dank! – moveson