Генерация отчета по диапазону дат в рельсах - PullRequest
22 голосов
/ 26 сентября 2008

Как вы будете создавать отчеты по выбранным пользователем диапазонам дат в приложении rails? Каковы лучшие сборщики дат даты?

редактировать в ответ на Патрик: я ищу несколько советов как по виджетам, так и по активным записям, но что мне действительно интересно, так это как правильно отображать список с ранжированием по дате на основе выбранных пользователем дат.

Ответы [ 2 ]

32 голосов
/ 26 сентября 2008

Мы задаем здесь вопрос интерфейса (т. Е. Вам нужен виджет) или вопрос ActiveRecord?

Виджеты выбора даты

1) Решение Rails по умолчанию : см. date_select документацию здесь .

2) Использовать плагин : зачем писать код? Мне лично нравится плагин CalendarDateSelect , использующий пару присосок, когда мне нужен диапазон.

3) Адаптация виджета Javascript к Rails : Практически тривиально интегрировать что-то вроде библиотеки пользовательского интерфейса Yahoo (YUI) Calendar , которая является всем Javascript, в Rails. С точки зрения Rails это просто еще один способ заполнить params[:start_date] и params[:end_date]. YUI Calendar имеет встроенную поддержку диапазонов.

Получение данных из виджетов

1) Решение Rails по умолчанию См. date_select документацию здесь .

#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 : Схоже с вышеописанным, только с более видимым пользовательским интерфейсом.

3) Адаптация виджета Javascript : Как правило, это означает, что некоторый элемент формы будет иметь введенную дату в виде строки. Отличная новость для вас, поскольку Date.parse - это серьезная магия. Параметры [: some_form_element_name] будут инициализированы Rails для вас.

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

Запись звонка в ActiveRecord

Легко, как пирог.

  #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
2 голосов
/ 26 сентября 2008

Это обычная практика, когда параметры URL управляют диапазоном выбранных записей. В вашем действии индекса вы можете сделать то, что предложил Патрик, и получить следующее:

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

Затем в представлении индекса создайте форму, которая привязывается к URL-адресу: start_date = 2008-01-01 & end_date = 2008-12-31. Помните, что это пользовательский ввод, поэтому будьте осторожны с ним. Если вы вернули его обратно на экран в своем действии index, обязательно сделайте это так:

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