我正在创建过滤部分视图,用户可以使用日历选择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}) }
from
和to
模型日期属性也是相关表格中的数据库字段。
在Rails中,Date
类有一系列方法beginning_of
(日,周,月等),但没有方法beginning_of_time
,end_of_time
,Date.min
,Date.max
。
是否有任何方法可以获得最小和最大日期?
答案 0 :(得分:2)
如果没有给出参数,您可以跳过start
和end
日期的条件:
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)}