两个日期参数之间的ruby查询
我有一个名为Result的模型。 我需要创建一个变量来返回特定日期范围之间的所有结果。 在Result模型上有一个名为date的字段,在表单上我将一个开始和结束日期作为参数捕获并将它们传递回控制器。
因此,如果用户在startdate参数中输入’01 / 01/2014’,在参数中输入’01 / 01/2015,我需要返回所有结果,其中日期在此范围之间。
当用户按下“filter”按钮时,参数最终被捕获为变量startdate和enddate
我试过这个,但似乎没有用
@results = Result.where("date >= ? and date <= ?", startdate, enddate")
然后我查看了生成的SQL并认为它需要是这个
@results = Result.where("date >= ? and date <= ?", '#{startdate)', '#{enddate}')
有任何想法吗?
谢谢
正如@ MrYoshiji所暗示的那样,在这种情况下你应该注意的一件事是你的startdate
和enddate
都是Date
, DateTime
或Time
对象。 否则,比较将失败。
1.)快捷方式是将datepicker应用于input
标记。 您可以在datepicker的初始值设定项中指定格式 。
2.)使用日期/时间标记rails form helper 。
3.)使用正则表达式来确保格式正确。
当它通过所有validation时,请执行以下操作:
@results = Result.where(date: Date.parse(startdate).beginning_of_day..Date.parse(enddate).end_of_day)
此外,您可以在最后添加一个救援,以确保它不会转到500页。
在查询结束时添加一个rescue Result.all
(在ALL-ELSE-FAILED的情况下)
是的,并确保你正确的时区。 postgresql的默认值是UTC。
感谢大家的建议。 这是我最终的解决方案。
首先,确保只使用datepicker在表单中输入有效日期,如下所示…
$(function(){ $('#startdate').datepicker({ changeYear: true, dateFormat:"dd/mm/yy", defaultDate: "#{Date.today.day}/#{Date.today.month}/#{Date.today.year}", change: function() { var isoDate = this.getValue('yyyy-mm-dd'); $(this).attr('data-value', isoDate); } }); $('#enddate').datepicker({ changeYear: true, dateFormat:"dd/mm/yy", defaultDate: "#{Date.today.day}/#{Date.today.month}/#{Date.today.year}", change: function() { var isoDate = this.getValue('yyyy-mm-dd'); $(this).attr('data-value', isoDate); } }); }); %form{:action => employee_results_path(@employee), :class => 'navbar-search pull-left'} .field %input{:type =>'text', :placeholder => params[:startdate] != nil ? params[:startdate] : "from date", :id => 'startdate', :name => "startdate", :style => 'width: 100px'} %input{:type =>'text', :placeholder => params[:startdate] != nil ? params[:enddate] : "to date", :id => 'enddate', :name => "enddate", :style => 'width: 100px'}
然后,在控制器中将参数捕获为变量并将它们解析为日期
sdate = Date.parse(params[:startdate]) edate = Date.parse(params[:enddate])
然后使用我在这个问题中收到的有用的解决方案
@results = Result.where(:date => sdate..edate)
这是一种享受。 感谢大家帮助我学习!
你可以写作
@results = Result.where(:date => startdate..enddate)
但在使用查询之前, startdate
和enddate
必须转换为Date
对象。