jueves, 11 de febrero de 2010

merge_conditions

Más de una vez hemos tenido que crear una query dinámicamente, en función de los parámetros que recibimos.

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)