2008-09-26 11 views
20

Wie würden Sie Berichte in einem Rails-App nach benutzerdefinierten Datumsbereichen erstellen? Was sind die besten Datumsauswahl?Erstellen eines Berichts nach Datumsbereich in Schienen

Bearbeiten als Antwort auf patrick: Ich bin auf der Suche nach ein wenig Widget und aktiven Datensatz Rat, aber was ich wirklich neugierig bin, ist, wie eine Datumsbereich Liste auf der Grundlage der vom Benutzer ausgewählten Daten angezeigt.

Antwort

30

Stellen wir hier eine Interface-Frage (d. H. Sie wollen ein Widget) oder eine ActiveRecord-Frage?

Datum Picking Widgets

1) Standard Rails Lösung: Siehe date_select Dokumentation here.

2) Verwenden Sie ein Plugin: Warum Code schreiben? Ich persönlich mag das CalendarDateSelect Plugin, mit einem Paar der Saugnäpfe, wenn ich eine Reichweite brauche.

3) Passen Sie ein Javascript Widget Rails: Es ist fast trivial ist so etwas wie die Yahoo UI-Bibliothek (YUI) Calendar, die alle Javascript, um Rails zu integrieren. Aus der Perspektive von Rails ist es nur eine weitere Möglichkeit, die params[:start_date] und params[:end_date] zu besetzen. YUI Calendar bietet native Unterstützung für Bereiche.

Abrufen der Daten aus den Widgets

1) Standard Rails Lösung Siehe date_select Dokumentation 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: Eher ähnlich wie oben, nur mit sexier sichtbar UI.

3) Ein JavaScript-Widget anpassen: In der Regel bedeutet dies, dass bei einigen Formularelementen das Datum als Zeichenfolge eingegeben wird. Gute Neuigkeiten für dich, da Date.parse eine ernsthafte Magie ist. Die Parameter [: some_form_element_name] werden von Rails für Sie initialisiert.

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

Schreiben der Aufruf von Active

Einfach als Torte.

#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

ein bisschen von beidem Widget und aktiven Datensatz, aber was ich wirklich neugierig ist, wie erholsam, um ein Datum anzuzeigen reichte Liste basierend auf vom Benutzer ausgewählten Daten. Insbesondere, wie Sie am besten die Eingabe vom Benutzer in den aktiven Datensatz finden. – srboisvert

+0

Ich habe mir die Freiheit genommen, meine Antwort zu erweitern, um für Sie hilfreicher zu sein. –

+0

sollte Build_date_from_params nicht in den Anwendungscontroller und nicht in den Anwendungshelfer gehen? – inglesp

2

Es ist keine unübliche Praxis, dass URL-Parameter den Bereich ausgewählter Datensätze steuern. In Ihrem Index Aktion können Sie das tun, was Patrick dies vorgeschlagen und haben:

#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]]) 

Dann in Ihrem Index Ansicht, erstellen Sie eine Form, die Angriffe auf start_date = 2008-01-01 & end_date = 2008-12-31? an die URL. Denken Sie daran, dass es sich um vom Benutzer bereitgestellte Eingaben handelt, seien Sie also vorsichtig damit. Wenn Sie es auf dem Bildschirm in Ihrem Index Aktion setzen, sollten Sie es wie dies zu tun:

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