Вопрос

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

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

Это было полезно?

Решение

Задаем ли мы здесь вопрос об интерфейсе (т.хочешь виджет) или вопрос по ActiveRecord?

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

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

2) Используйте плагин :Зачем писать код?мне лично нравится КалендарьДатаВыбрать плагин, использующий пару присосок, когда мне нужен диапазон.

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

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

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) КалендарьДатаВыбрать:Очень похоже на описанное выше, только с более привлекательным интерфейсом.

3) Адаптируйте виджет Javascript:Обычно это означает, что некоторый элемент формы будет иметь дату в виде строки.Отличные новости для вас, поскольку Date.parse — это настоящая магия.Params[: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

Другие советы

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

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

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

Showing records starting on 
<%= h start_date %> 
and ending on 
<%= h end_date %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top