Rieles: combinando parámetros opcionales en una consulta

Tengo una vista con una enorme lista de registros paginados que necesitan filtrado.

Los usuarios pueden filtrar por registros de diferentes maneras (como los registros ‘guardados’, los registros ‘leer’ y los registros ‘marcar borrados’) y me gustaría que pudieran combinar estos filtros de cualquier forma posible.

Mi enfoque actual, defectuoso, no funciona. El código a continuación no produce nada a menos que todos los parámetros estén especificados y sean válidos:

#view. Set the 'se' filter to true; leave all others as is params[:id], :se=>"true", :st=>params[:st], :re=>params[:re]) do %> 
Toggle SE
#controller query. Add whichever params are passed into the conditions for the new page. #query is paginated and sorted @records = Record.where("user_id IN (?) AND see = ? AND star = ? AND delete = ? AND like = ?", @users.select("id"), params[:se], params[:st], params[:re]).paginate :page => params[:page], :order => (sort_column + " " + sort_direction)

¿Cuál es la mejor manera de crear este sistema de filtrado?
Me imagino que una clasificación del lado del cliente sería más rápida que pedirle al servidor que se involucrara cada vez, ¿existe una forma simple de AJAX para lograr este tipo de cosas? Imagine los filtros que el usuario puede activar y desactivar en cualquier combinación.

Prueba esto:

 conditions = {:user_id => @users.select("id")} { :se => :see, :st => :star, :del => :delete }.each{|k1, k2| conditions[k2] = params[k1] unless params[k1].blank?} @records = Record.where(conditions).paginate(...) 

Las conditions hash se rellenarán en función de los valores presentes en el hash params .

Editar 1

Puedes combinar condiciones hash y array.

 @records = Record.where(conditions).where( ":created_at > ?", Date.today - 30).paginate(...) 

Puede cambiar la condición user_id a lo que desee especificando

 conditions[:user_id] = @user.id 

En la statement anterior, si el RHS es una matriz, los Rails generan automáticamente la cláusula IN . De lo contrario, se realiza la comprobación de igualdad ( = ).

También se pueden usar ámbitos anónimos: combina matrices de condiciones en Rails