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

时间:2014-06-05 16:52:41

标签: ruby-on-rails 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}')

有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

正如@ MrYoshiji的建议,在这种情况下你应该注意的一件事是你的startdateenddate都是Date,{{1} }或DateTime个对象。否则,比较将失败。

1。)快捷方式是将日期选择器应用于Time标记。您可以在datepicker的初始化程序中specify the format

2。)使用date/time tag rails form helper

3.。)使用regex确保格式正确。

当它通过所有验证后,请执行:

input

此外,您可以在最后添加一个救援,以确保它不会转到500页。

在查询结束时添加@results = Result.where(date: Date.parse(startdate).beginning_of_day..Date.parse(enddate).end_of_day) (如果是ALL-ELSE-FAILED)

是的,并确保您获得正确的时区。 postgresql的默认值是UTC。

答案 1 :(得分:1)

感谢大家的建议。这是我最终的解决方案。

首先,确保只使用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)
这是一种享受。感谢大家帮助我学习!

答案 2 :(得分:0)

您可以写为

@results = Result.where(:date => startdate..enddate)

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