2010-06-15 2 views
2

Я пытаюсь найти результаты модели, где она запрашивается в результате двух условий.Rails - Найти состояние двух полей модели

У меня есть поиск тег, который ищет

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

, но я хотел бы для поиска, чтобы найти все записи, где «имя LIKE Params [Поиск] или описание LIKE Params [Поиск].

есть ли способ, чтобы добавить либо в состояние, в рельсах

или я должен сделать, если заявление

ответ

3

для Rails 2.x вы можете использовать этот запрос, который не уязвимы для SQL-инъекций:

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

Model.find (:? все,: условия => «Имя LIKE«% # {PARAMS [: се arch]}% 'OR description like'% # {params [: search]}% '")

это может сработать для вас.

+2

Использование параметров поиска прямо так, сделает запрос уязвимым для SQL-инъекций. –

+0

Есть ли способ обойтись без этой уязвимости? – ChrisWesAllen

2

В РЕЛЬСАХ 2,3 (используют параметры вместо чистого кода SQL за помощью инъекции)

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

Мне также очень нравится использовать Condition Builder for ActiveRecord в 2.x проектах рельсов, потому что вы можете сделать:

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 

Примечание: пользователи Postgres должны использовать ILIKE (без учета регистра), а не LIKE.

Примечание 2: Rails 3.0 будет использовать цепочку where where, которая довольно крутая, и должен скоро добавить оператор OR ActiveRelation GitHub - но он будет выглядеть как User.where (: name => 'bob'). .Или (: имя => 'же')