Generazione di un rapporto per intervallo di date in rotaie
-
02-07-2019 - |
Domanda
Come faresti a produrre report in base agli intervalli di date selezionati dall'utente in un'app rails? Quali sono i migliori selettori di intervalli di date?
modifica in risposta a patrick: sto cercando un po 'di widget e consigli sui record attivi, ma ciò di cui sono davvero curioso è come visualizzare in modo riposante un elenco di date basato sulle date selezionate dall'utente.
Soluzione
Stiamo ponendo una domanda di interfaccia qui (ovvero vuoi un widget) o una domanda ActiveRecord?
Widget di selezione della data
1) Soluzione predefinita di Rails : consulta la documentazione date_select
qui .
2) Utilizza un plug-in : perché scrivere codice? Personalmente mi piace il CalendarDateSelect , usando un paio di ventose quando ho bisogno di un intervallo.
3) Adatta un widget Javascript a Rails : è quasi banale integrare qualcosa come la libreria UI di Yahoo (YUI) Calendario , che è tutto Javascript, su Rails. Dal punto di vista di Rails è solo un altro modo per popolare i parametri [: start_date]
e [: end_date]
. Il calendario YUI ha il supporto nativo per gli intervalli.
Ottenere i dati dai widget
1) Soluzione predefinita di Rails consulta la documentazione date_select
qui .
#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 : piuttosto simile a quanto sopra, solo con un'interfaccia utente visibile più sexy.
3) Adatta un widget Javascript : in genere questo significa che alcuni elementi del modulo avranno la data immessa come stringa. Grandi notizie per te, dato che Date.parse è una vera magia. I parametri [: some_form_element_name] saranno inizializzati da Rails per te.
#goes in controller. Please handle errors yourself -- Javascript != trusted input.
report_start_date = Date.parse(params[:report_start_date])
Scrittura della chiamata su ActiveRecord
Facile come una torta.
#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
Altri suggerimenti
Non è una pratica inflessibile avere parametri URL che controllano l'intervallo di record selezionati. Nella tua azione indice, puoi fare ciò che Patrick ha suggerito e avere questo:
#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]])
Quindi, nella tua vista indice, crea un modulo che si attacchi a? start_date = 2008-01-01 & amp; end_date = 2008-12-31 all'URL. Ricorda che è un input fornito dall'utente, quindi fai attenzione. Se lo rimetti sullo schermo nell'azione dell'indice, assicurati di farlo in questo modo:
Showing records starting on
<%= h start_date %>
and ending on
<%= h end_date %>