2010-04-28 9 views
5

Si consideri il seguente codice che deve essere gettato in un AR ritrovamento:L'aggiunta di un criterio a guisa di Rails Condizioni bloccare

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

ho bisogno di aggiungere un'altra condizione che è un criterio come su un attributo 'profilo' . Come posso fare questo, poiché ovviamente un LIKE viene solitamente fatto tramite un array, non con una chiave hash.

risposta

5

è possibile ambito il modello con le condizioni di hash, e quindi eseguire find sulla portata con le condizioni di matrice:

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

Quando si chiama il vostro record attivo trovare, si invia la stringa condizioni prima, poi l'hash con i valori come:

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

questo modo è possibile continuare a fare quello che stai facendo :)

+1

cosa succede se params [: age] non è presente? – Salil

+0

Bene, ho semplificato, può costruire la stringa proprio mentre controlla i parametri per riempire il suo hash delle condizioni. –

1

follwing è brutto ma funziona

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] 
Problemi correlati