Generowanie raportu według zakresu dat w rails

Jak możesz tworzyć raporty według wybranych przez użytkownika zakresów dat w aplikacji rails? Jaki jest najlepszy wybór dat?

Edit w odpowiedzi na Patryk: Szukam trochę zarówno widget i active record porad, ale to, co mnie naprawdę ciekawi, to jak spokojnie wyświetlić listę wahał daty na podstawie wybranych dat użytkownika.

Author: srboisvert, 2008-09-26

2 answers

Czy zadajemy tutaj Pytanie dotyczące interfejsu (np. chcesz widget) czy pytanie dotyczące ActiveRecord?

Widżety Wyboru Daty

1) domyślne rozwiązanie Rails : Zobacz date_select dokumentację tutaj .

2) użyj wtyczki : Po co pisać kod? Osobiście podoba mi się wtyczka CalendarDateSelect , używająca pary frajerów, gdy potrzebuję zasięgu.

3) Adapt a JavaScript widget to Rails: integracja jest niemal banalna coś w rodzaju Biblioteki Yahoo UI (YUI) Calendar , która jest w całości Javascript, do Rails. Z perspektywy Rails jest to kolejny sposób na wypełnienie params[:start_date] i params[:end_date]. Kalendarz YUI ma natywną obsługę zakresów.

Pobieranie danych z widżetów

1) domyślne rozwiązanie Rails Zobacz date_select dokumentację tutaj .

#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: dość podobny do powyższego, tylko z bardziej seksownym widocznym interfejsem użytkownika.

3) Adapt a JavaScript widget : zazwyczaj oznacza to, że jakiś element formularza będzie miał wprowadzoną datę jako ciąg znaków. Świetna wiadomość, od Randki.parse to poważna Magia. Params[:some_form_element_name] zostanie zainicjalizowany przez Rails.

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

Zapisanie połączenia do ActiveRecord

Łatwizna.
  #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
 31
Author: Patrick McKenzie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 16:42:23

Nie jest niepokojącą praktyką, aby parametry URL kontrolowały zakres wybranych rekordów. W akcji index możesz zrobić to, co zasugerował Patrick i mieć to:

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

Następnie w widoku indeksu Utwórz formularz, który się zaznacza ?start_date=2008-01-01&end_date = 2008-12-31 do URL. Pamiętaj, że jest to wejście dostarczane przez użytkownika, więc uważaj z nim. Jeśli umieścisz go z powrotem na ekranie w akcji indeks, pamiętaj, aby zrobić to w następujący sposób:

Showing records starting on 
<%= h start_date %> 
and ending on 
<%= h end_date %>
 2
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 16:37:05