2016-03-31 12 views
0

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.

Antwort

0

Jede Funktion/Methode gibt den letzten ausgewerteten Wert zurück. In Ihrem Fall ist es where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft'

die Null zurück, wenn Strenge nicht ‚weich‘ ist. So fügen Sie eine Rückkehr sollte tun, was Sie wollen:

def self.matches(field_name, param, rigor = 'exact') 
    return where("lower(#{field_name}) like ?", "#{param}") if rigor == 'exact' 
    where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft' 
    end 
+0

Ja, dies behebt das Problem. Vielen Dank! – moveson

Verwandte Themen