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.

È stato utile?

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 %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top