两个日期参数之间的Ruby查询



我有一个名为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也建议的那样,在这种情况下您应该注意的一件事是您的startdateenddate都是Date, DateTimeTime对象。否则,比较失败。

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)

但是在使用查询之前,startdateenddate必须转换为Date对象

最新更新