2010-06-15 6 views
2

J'essaie de trouver les résultats d'un modèle où il interroge comme le résultat de deux conditions.Rails - Trouver la condition de deux champs de modèle

J'ai une balise de recherche qui cherche

Model.find(:all, :conditions => "name LIKE params[search]") 

mais je voudrais que la recherche pour trouver tous les enregistrements où « nom LIKE params [recherche] ou la description COMME params [recherche].

Est-il possible d'ajouter un oU dans une condition dans des rails

ou devrais-je faire une déclaration si

Répondre

3

pour 2.x Rails vous pouvez utiliser cette requête, ce qui est vulnérable aux attaques par injection SQL:

Model.all(:conditions => ["name LIKE ? OR description LIKE ?", 
    "%#{params[:search]}%", "%#{params[:search]}%"]) 
0

Model.find (:?: tous, conditions => « name LIKE « % # {params [: se arch]}% 'OU description comme'% # {params [: search]}% '")

cela pourrait fonctionner pour vous.

+2

L'utilisation directe des paramètres de recherche rendra la requête vulnérable aux attaques par injection SQL. –

+0

Y a-t-il un moyen de se passer de cette vulnérabilité? – ChrisWesAllen

2

Dans RAILS 2.3 (utilise des paramètres au lieu de pur code SQL pour l'aide à l'injection)

Model.all(:conditions=>['name LIKE ? OR name like ?','%'[email protected]_one+'%', '%'[email protected]_two+'%']) 

J'aime aussi vraiment utiliser Condition Builder for ActiveRecord dans RAILS projets 2.x, parce que vous pouvez faire:

Condition.block{|c| 
    c.and :published, true 
    c.and {|d| 
    d.or :full_text, "LIKE", "%#{options[:qs]}%" 
    d.or :full_text, "LIKE", "%#{options[:qs]}%" 
    } 
end 

Remarque: Les utilisateurs de Postgres doivent utiliser ILIKE (insensible à la casse) au lieu de LIKE.

Note 2: Rails 3.0 utiliserait la clause where chaînage, ce qui est plutôt cool, et devrait ajouter un opérateur OR bientôt ActiveRelation GitHub - mais ça ressemblera à User.where (: name => 'bob') .ou (: name => 'même')

Questions connexes