2010-04-28 4 views
5

Rozważmy następujący kod, który ma być rzucony na znalezisku AR:Dodawanie podobny kryteria Rails Warunki zablokować

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

muszę dodać kolejny warunek, który jest podobnym kryteria w atrybucie „profil” . Jak mogę to zrobić, ponieważ oczywiście LIKE zwykle odbywa się za pomocą tablicy, a nie klucza skrótu.

Odpowiedz

5

można zakres model z warunkami hash, a następnie wykonać find na zakres warunków tablicy:

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

Po wywołaniu Twój aktywny rekord znaleźć, możesz wysłać swoje warunki łańcuch, potem hash z wartościami takimi jak:

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

ten sposób można dalej robić to, co robisz :)

+1

co się stanie, jeśli nie ma params [: age]? – Salil

+0

Cóż, uprościłem, on może zbudować ciąg, tak jak sprawdza params, aby wypełnić swój hash warunków. –

1

follwing jest brzydki, ale działa

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]