2010-04-24 2 views
5

Hola chicos, tengo un problema con el filtrado de la presentación de varios miles de artículos comerciales que tengo en mi sistema. Según las especificaciones del sistema que estamos construyendo, tenemos que tener un formulario que permita a las personas poner una fecha de inicio y luego un intervalo en minutos para filtrar la presentación de los elementos. He creado mis funciones de ayuda para devolver todas las operaciones dentro de ese período de intervalo, pero no puedo construir correctamente el formulario que devolverá un valor de fecha y hora y un valor entero en la parte superior de la página de índice.Creando un formulario de rieles para filtrar una página de índice?

¿Alguna idea? ¿Tendría que construir un objeto de modelo separado para asignar valores a, o hay una manera más simple?

Respuesta

16

En su página de índice puede crear una forma de filtro como éste

<%= form_tag '', :method => :get do %> 
    <%= text_field_tag :value_one %> 
    <%= text_field_tag :value_two %> 
    <%= submit_tag 'Filter' %> 
<% end %> 

Su formulario a continuación, hacer un GET en su página con los parámetros de cadena de consulta y luego en su controlador puede buscar los parámetros de filtro que podría haber sido pasado.

+2

Si desea omitir el '& commit = Filter' de la URL, puede escribir' <% = submit_tag 'Filter', name: nil%> '. –

2

me gusta la construcción gradual de un filtro en mi controlador, es decir:

def index 

    filter = [] 

    if params.has_key?("filter") 

    if !params[:filter][:user_id].blank? 
     id = params[:filter][:user_id] 
     filter << ["user_id = #{id.to_i}"] 
    end 

    if !params[:filter][:project_id].blank? 
     id = params[:filter][:project_id] 
     filter << ["project_id = #{id.to_i}"] 
    end 

    if !params[:filter][:change_type_id].blank? 
     id = params[:filter][:change_type_id] 
     filter << ["change_type_id = #{id.to_i}"] 
    end 

    end 

    @logs = LogEntry.where(filter.join(" AND ")).order('created_at DESC')  

end 

Si no se selecciona un filtro en la vista (yo uso el select_tag asistente de formulario), la consulta DB devolverá todos los registros.

+1

Me gusta este enfoque (¡es la segunda parte de la respuesta a la pregunta!). Tal vez en lugar de '! Params [...]. Blank '? Es un poco más bonito con' params [...]. Present? '. –

+4

En realidad, no es necesario crear gradualmente un filtro como este; en su lugar, debe crear gradualmente una consulta de registro activa llamando a la instrucción where para varias condiciones para reducir gradualmente el conjunto de resultados. Rails es lo suficientemente inteligente como para ejecutar todo en una declaración, incluso si tiene varias llamadas al modelo LogEntry. – Noz

Cuestiones relacionadas