我有一个名为Result的模型。我需要创建一个变量,返回在一定日期范围内的所有结果。在Result模型上有一个名为date的字段,在一个表单上,我捕获开始和结束日期作为参数,并将它们传递回控制器。
因此,如果用户在startdate参数中输入'01/01/2014',在参数中输入'01/01/2015 ',我需要返回日期在此范围内的所有结果。
当用户按下"过滤器"按钮时,参数最终被捕获为变量startdate和enddate
我试过这个,但它似乎不工作
@results = Result.where("date >= ? and date <= ?", startdate, enddate")
然后我看了看结果SQL,认为它应该是这样的
@results = Result.where("date >= ? and date <= ?", '#{startdate)', '#{enddate}')
任何想法?
谢谢
正如@MrYoshiji's也建议的那样,在这种情况下您应该注意的一件事是您的startdate
和enddate
都是Date
, DateTime
或Time
对象。否则,比较失败。
1)。一个快捷方式是在input
标记中应用日期选择器。您可以在日期选择器的初始化项中指定格式。
2)。使用日期/时间标签rails表单帮助器。
3)。使用正则表达式以确保格式正确。
当它通过所有的验证时,然后执行:
@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。
感谢大家的建议。这就是我最终的解决方案。
首先,通过使用日期选择器确保表单中只能输入有效的日期,如下所示:
$(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
对象