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)

1 comentario:

  1. Muy buena! Te las une con AND las condiciones, entiendo, no?

    Yo 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!

    ResponderEliminar