2014-07-07 6 views
0

J'utilise le code suivant pour l'instant:Comment effectuer une recherche avec Rails?

def self.search(query) 
    where("name like ?", "%#{query}%") 
end 

qui ne fonctionne que pour le nom, mais au fond, je besoin de travailler pour tout (date de naissance, nom, prénom + nom et ainsi de suite). Pouvez-vous s'il vous plaît me transmettre quelques idées sur la façon dont je pourrais rendre ce morceau de code plus adapté à mes besoins?

Merci.

+0

départ https://github.com/activerecord-hackery/meta_search – Nithin

+0

Cela devrait fonctionner 'où (" nom LIKE? OU nom de famille? OU dob LIKE? ","% # {Requête}% ","% # {requête}% ","% # {requête}% ")' – Pavan

+0

je pense que sur 'dob' cela ne fonctionnera pas si' dob' 'date/heure 'type de colonne –

Répondre

0

Si vous utilisez MySQL, la gemme dusen fera ce que vous voulez.

+0

J'utilise MySQL – Xeen

+0

J'ai mis à jour ma réponse pour MySQL. –

0

Dans votre modèle, ajoutez:

def self.search(cols, query) 
    tbl = self.arel_table 
    fq = tbl[cols.shift].matches("%#{query}%") 
    q = cols.inject(fq) do |acc, col| 
    acc.or(tbl[col].matches("%#{query}%")) 
    end 
    where(q) 
end 

Et vous pouvez alors l'utiliser comme:

User.search([:name, :surname], 'name') 

qui va générer agréable SQL comme:

SELECT "users".* FROM "users" WHERE (("users"."name" LIKE '%name%' 
OR "users"."surname" LIKE '%name%')) 

Si vous avez besoin plus fin contrôle sur votre requête, j'ajoute parfois la méthode de commodité suivante à AR:

def self.arel_where(&block); where(yield self.arel_table); end 

Et vous pouvez faire:

User.arel_where do |tbl| 
    name = '%name%'; surname = '%sur%' 
    tbl[:name].matches(name).and(tbl[:surname].matches(surname)) 
end 
Questions connexes