在Rails中按日期范围生成报告

22

你会如何在rails应用程序中根据用户选择的日期范围生成报告?最好的日期范围选择器是什么?

针对Patrick的回复进行编辑:我需要一些小部件和Active Record建议,但我真正好奇的是如何基于用户选择的日期呈现具有RESTful风格的日期范围列表。

2个回答

32

这里是一个接口问题吗(即您需要一个小部件),还是一个ActiveRecord问题?

日期选择小部件

1)默认Rails解决方案:请参阅date_select文档此处

2)使用插件:为什么要编写代码?我个人喜欢CalendarDateSelect插件,当我需要范围时,使用一对这样的插件。

3)将JavaScript小部件适应于Rails:将像Yahoo UI库(YUI)Calendar这样的东西集成到Rails中几乎是微不足道的,因为它全部都是JavaScript。 从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) CalendarDateSelect: 与上述类似,只是界面更加性感。

3) 适应JavaScript小部件: 通常意味着某个表单元素将具有日期输入字符串。对您来说是个好消息,因为Date.parse是一些严肃的魔法。Rails会为您初始化params [:some_form_element_name]。

#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

这涉及到部件和活动记录的一些内容,但我真正好奇的是如何根据用户选择的日期以RESTful方式显示日期范围列表。具体来说,最好的方法是如何将用户输入传递给活动记录查找。 - srboisvert
我已经自作主张地扩展了我的答案,以更加有用的方式帮助你。 - Patrick McKenzie
“build_date_from_params” 应该放在应用程序控制器中而不是应用程序助手中,对吗? - inglesp

2

在IT技术中,使用URL参数来控制所选记录的范围是一种常见的做法,并不算是不符合RESTful规范的行为。在您的索引操作中,可以按照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&end_date=2008-12-31添加到URL上。请记住这是用户提供的输入,因此请小心处理。如果您在索引操作中将其放回屏幕上,请确保像这样操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接