您将如何在rails应用中按用户选择的日期范围生成报告?什么是最好的日期范围采摘者?
编辑以回应帕特里克:我正在寻找一些小部件和活动记录建议,但我真正好奇的是如何根据用户选择的日期安排显示日期范围列表。
答案 0 :(得分:32)
我们在这里询问界面问题(即你想要一个小部件)还是一个ActiveRecord问题?
1)默认Rails解决方案:请参阅date_select
文档here。
2)使用插件:为什么要编写代码?我个人喜欢CalendarDateSelect插件,当我需要一个范围时使用一对吸盘。
3)将Javascript小部件改编为Rails :将诸如JQL之类的Yahoo UI库(YUI)Calendar之类的东西集成到Rails中几乎是微不足道的。从Rails的角度来看,它只是填充params[:start_date]
和params[:end_date]
的另一种方式。 YUI日历本机支持范围。
1)默认Rails解决方案请参阅date_select
文档here。
#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 :与上面的内容非常类似,只是性感的可见UI。
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])
很容易就是馅饼。
#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
答案 1 :(得分:2)
让URL参数控制所选记录的范围并不是一种不合理的做法。在您的索引操作中,您可以执行Patrick建议并执行此操作:
#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&amp; end_date = 2008-12-31到URL。请记住,它是用户提供的输入,因此请小心。如果您在索引操作中将其放回屏幕上,请务必按照以下步骤操作:
Showing records starting on
<%= h start_date %>
and ending on
<%= h end_date %>