2010-04-28 3 views
5

Рассмотрим следующий код, который должен быть выброшен на AR находке:Добавление LIKE критериев до Rails Условия блокировки

conditions = [] 
conditions[:age] = params[:age] if params[:age].present? 
conditions[:gender] = params[:gender] if params[:gender].present? 

мне нужно добавить еще одно условие, которое является LIKE критерии на атрибут «профиль» , Как я могу это сделать, так как очевидно, что LIKE обычно выполняется через массив, а не хеш-ключ.

ответ

5

Вы можете охват вашей модели с хэш условий, а затем выполнить find по размаху с условиями массива:

YourModel.scoped(:conditions => conditions).all(:conditions => ["profile like ?", profile]) 
0

Когда вы называете активная запись найти, вы посылаете условия строку первой, а затем хэш со значениями, такими как:

:conditions => [ "age = :age AND gender = :gender AND profile LIKE :profile", conditions ] 

Таким образом, вы можете продолжать делать то, что вы делаете :)

+1

Что произошло, если параметры [: age] нет? – Salil

+0

Ну, я упростил, он может построить строку так же, как он проверяет параметры, чтобы заполнить его хэш условий. –

1

Follwing некрасиво, но это работает

conditions = {} #This should be Hash 
conditions[:age] = params[:age] if params[:age].present? 
conditions[:gender] = params[:gender] if params[:gender].present? 
conditions[:profile] = '%params[:profile]%' if params[:profile].present? 

col_str ="" #this is our column names string for conditions array 

col_str = "age=:age" if params[:age].present? 
col_str+= (col_str.blank?)? "gender=:gender" :" AND gender=:gender" if params[:gender].present? 
col_str += (col_str.blank?) 'profile like :profile' : ' AND profile like :profile' if params[:profile].present? 

:conditions=>[col_str , conditions] 
Смежные вопросы