最小和最大可能的日期

时间:2015-06-23 14:57:19

标签: ruby-on-rails ruby date

我正在创建过滤部分视图,用户可以使用日历选择from - 日期和to - 日期。然后在模型范围内使用这些日期在数据库查询中执行SQL Where子句。如果用户未选择其中一个日期,则应分配默认值:from的最小可用日期和to的最大可用日期。

unless params[:from].blank? and params[:to].blank?
   from = begin Date.parse(params[:from]) rescue ??? end
   to = begin Date.parse(params[:to]) rescue ??? end
   @model_instances = @model_instances.start_end from, to
end

(...)

scope :start_end, -> (start_date, end_date) { where('(:start_date <= "from" AND "from" <= :end_date ) OR' +
                                              '(:start_date <= "to" AND "to" <= :end_date ) OR' +
                                              '("from" <= :start_date AND :end_date <= "to")',
                                               {start_date: start_date, end_date: end_date}) }

fromto模型日期属性也是相关表格中的数据库字段。

在Rails中,Date类有一系列方法beginning_of(日,周,月等),但没有方法beginning_of_timeend_of_timeDate.minDate.max

是否有任何方法可以获得最小和最大日期?

2 个答案:

答案 0 :(得分:2)

如果没有给出参数,您可以跳过startend日期的条件:

if params[:from].present? and params[:to].present?
  @model_instances.start_end(params[:from], params[:to]) 
end

然后,您将获得不依赖于日期的结果,因为没有填写from和/或end日期。

答案 1 :(得分:0)

如果没有传递参数,您可以将日期范围与模型的值进行比较,并设置默认值。

#setup default if desired, or you can skip if params are blank
from = params[:from] || default_from
to = params[:to] || default_to
@model_instances.start_end(from, to)

如果您使用activerecord的日期范围

,那么您的范围将如下所示
scope :start_end, ->(start_date, end_date){where(from: start_date..end_date, to:start_date..end_date)}