2008-09-26 13 views
20

¿Qué le parece producir informes según los rangos de fechas seleccionados por el usuario en una aplicación de rieles? ¿Cuáles son los mejores selectores de rango de fecha?Generación de un informe por rango de fechas en raíles

edit en respuesta a patrick: Estoy buscando un poco de widget y consejo de registro activo, pero lo que realmente me llama la atención es cómo mostrar con tranquilidad una lista de fechas basadas en las fechas seleccionadas por el usuario.

Respuesta

30

¿Estamos haciendo una pregunta de interfaz aquí (es decir, desea un widget) o una pregunta de ActiveRecord?

fecha de picking Reproductores

1) Rieles Solución defectodate_select: véase la documentación here.

2) Utilice un complemento: ¿Por qué escribir código? Personalmente me gusta el plugin CalendarDateSelect, usando un par de retoños cuando necesito un rango.

3) Adaptar un widget Javascript para Rieles: Es casi trivial para integrar algo así como la biblioteca de interfaz de usuario Yahoo (YUI) Calendar, que es todo Javascript, a rieles. Desde la perspectiva de Rails es solo otra manera de poblar el params[:start_date] y el params[:end_date]. YUI Calendar tiene soporte nativo para rangos.

Obtención de los datos de los widgets

1) defecto Rails Solucióndate_select Ver documentación here.

#an application helper method you'll find helpful 
#credit to http://blog.zerosum.org/2007/5/9/deconstructing-date_select 

# Reconstruct a date object from date_select helper form params 
def build_date_from_params(field_name, params) 
    Date.new(params["#{field_name.to_s}(1i)"].to_i, 
     params["#{field_name.to_s}(2i)"].to_i, 
     params["#{field_name.to_s}(3i)"].to_i) 
end 

#goes into view 
<%= date_select "report", "start_date", ... %> 
<%= date_select "report", "end_date", ... %>  

#goes into controller -- add your own error handling/defaults, please! 
report_start_date = build_date_from_params("start_date", params[:report]) 
report_end_date = build_date_from_params("end_date", params[:report])  

2) CalendarDateSelect: Más bien similar a la anterior, sólo con más atractivo UI visible.

3) Adapte un widget de Javascript: Normalmente esto significa que algún elemento de formulario tendrá la fecha de entrada como una cadena. Una gran noticia para ti, ya que Date.parse es una gran magia. Los parametros [: some_form_element_name] serán inicializados por Rails para usted.

#goes in controller. Please handle errors yourself -- Javascript != trusted input. 
report_start_date = Date.parse(params[:report_start_date]) 

Escribiendo la llamada a ActiveRecord

fácil como pastel.

#initialize start_date and end_date up here, by pulling from params probably 
    @models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?', 
    start_date, end_date]) 
    #do something with models 
+0

Un poco de ambos widget y registro activo pero lo que estoy realmente curioso sobre es cómo mostrar restfully una fecha oscilado lista basada en las fechas seleccionadas por el usuario. Específicamente, la mejor manera de obtener la entrada del usuario en el registro activo. – srboisvert

+0

Me he tomado la libertad de ampliar mi respuesta para ser más útil para usted. –

+0

no debería build_date_from_params entrar en el controlador de la aplicación en lugar de la aplicación de ayuda? – inglesp

2

No es una práctica inofensiva tener parámetros de URL que controlen el rango de registros seleccionados. En su acción index, se puede hacer lo que sugirió Patrick y tienen la siguiente:

#initialize start_date and end_date up here, by pulling from params probably 
    @models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?', params[:start_date], params[:end_date]]) 

Luego, en su vista de índice, crear un formulario que tachuelas en fecha_inicial = 2008-01-01 & fecha_final = 2008-12-31? a la URL Recuerde que es una entrada proporcionada por el usuario, así que tenga cuidado con ella. Si se pone de nuevo en la pantalla de su acción index, asegúrese de hacerlo de esta manera:

Showing records starting on 
<%= h start_date %> 
and ending on 
<%= h end_date %> 
Cuestiones relacionadas