2010-04-28 10 views
5

considere el siguiente código que va a ser lanzado en un hallazgo AR:Adición de un criterio semejante al Rieles Condiciones bloquear

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

tengo que añadir otra condición que es un criterio que se extienden sobre un atributo de 'perfil' . ¿Cómo puedo hacer esto, ya que, obviamente, un LIKE se hace generalmente a través de una matriz, no una clave hash.

Respuesta

5

puede alcance su modelo con las condiciones de hash, y luego realizar find sobre el alcance de las condiciones de matriz:

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

Cuando llame a su registro activo encontrar, se envía la cadena de condiciones en primer lugar, a continuación, el hash con los valores como:

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

esa manera se puede seguir haciendo lo que está haciendo :)

+1

¿Qué pasó si params [: age] no está presente? – Salil

+0

Bueno, simplifiqué, él puede construir la cadena justo cuando él comprueba los params para llenar el hash de sus condiciones. –

1

follwing es feo, pero funciona

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] 
Cuestiones relacionadas