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.
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
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 %>
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