Una opcion es mantener el string de la condicion y una hash con los parametros:
str_conditions => "email is not null"
h_conditions = {}
if !params[:group_ids].blank?
str_conditions += " and group_id in (?)"
h_conditions[:group_ids] = params[:groups_ids]
end
if !params[:manager_id].blank?
str_conditions += " and manager_id = ?"
h_conditions[:manager_id] = params[:manager_id]
end
User.find :all, :conditions => [str_conditions, h_conditions]
Pero se engorrina bastante, con tanto "+=" y con tanto "and" y con tanta hash.
Otra opcion más clara es tener cada grupo de condiciones separado, y utilizar luego el metodo merge_conditions de ActiveRecord::Base.
c1=(params[:group_ids].blank?) ? [] : ["group_id in (?)", params[:groups_ids]]
c2=(params[:manager_id].blank?) ? [] : ["manager_id = ?", params[:manager_id]]
User.find :all, :conditions => merge_conditions("email is not null", c1, c2)
Muy buena! Te las une con AND las condiciones, entiendo, no?
ResponderEliminarYo lo que venía haciendo hasta ahora, era tener un array para guardar las condiciones, y un hash para guardar los valores de las condiciones.
conditions = []
values = {}
conditions.push('value1 = :value1')
values[:value1] = 'asdf'
conditions.push('value2 = :value2')
values[:value2] = 12
User.find(:all, :conditions => [conditions.join(' AND '), values])
Que creo que está a medio camino de las dos que propones. Me gusta más el merge_conditions, que no conocía. Gracias!!
Saludos!