Создание отчета по диапазону дат в рельсах
-
02-07-2019 - |
Вопрос
Как бы вы поступили с созданием отчетов по выбранным пользователем диапазонам дат в приложении 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 %>