Ruby on rails 检查日期是否在日期范围内

Ruby on rails 检查日期是否在日期范围内,ruby-on-rails,ruby,date,activerecord,range,Ruby On Rails,Ruby,Date,Activerecord,Range,我创建了一个对象数组,如下所示: all_project_assignments = ProjectAssignment.where(active: true, hour_type_id: 1) 现在我想使用这个结果数组只选择日期范围内的工作分配。日期范围为: date_range = @current_month.at_beginning_of_month..@current_month.at_end_of_month 所有_项目_分配的每个成员都有字段输入_日期,该日期必须在范围内 我的

我创建了一个对象数组,如下所示:

all_project_assignments = ProjectAssignment.where(active: true, hour_type_id: 1)
现在我想使用这个结果数组只选择日期范围内的工作分配。日期范围为:

date_range = @current_month.at_beginning_of_month..@current_month.at_end_of_month
所有_项目_分配的每个成员都有字段输入_日期,该日期必须在范围内

我的选择是:

project_assignments = ProjectAssignment.where(active: true, hour_type_id: 1, entry_date: date_range)

但我不想要另一个数据库查询。那么,最好的方法是什么呢?

您可以将查询链接在一起:

all_project_assignments = ProjectAssignment.where(active: true, hour_type_id: 1)
date_range = @current_month.at_beginning_of_month..@current_month.at_end_of_month
project_assignments = all_project_assignments.where(entry_date: date_range)
但是,这将再次查询数据库

如果要筛选检索到的行,只需执行以下操作

project_assignments = all_project_assignments.select do |assignment|
    assignment.entry_date.between?(@current_month.at_beginning_of_month, @current_month.at_end_of_month)
end

如果范围是整个月,那么您可以尝试使用此查询吗

project_assignments = all_project_assignments.select do |assignment|
    assignment.entry_date.month == @current_month
end
如果@current_month为整数,则可能检查on范围条件:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
这将生成以下SQL:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00')
所以在你的情况下:

all_project_assignments = ProjectAssignment.where(active: true, hour_type_id: 1, entry_date: @current_month.at_beginning_of_month..@current_month.at_end_of_month)

如果按当前月份比较,请注意
(1..12)
您将得到同一月份的结果,但是去年的结果。

这将导致第二次数据库查询。是的,我首先误解了这个问题。添加了第二个选项,不再查询数据库。是的,应该这样做。他们可能还需要调用,因为生成的数组可能包含那些天以外的任何值的nils。是的,现在就可以了。谢谢大家。@Marija单击此答案上的绿色小复选标记,如果它解决了您的问题。我是否更正您希望保留原始结果集,并基本上过滤数组以创建第二个结果集?是的。。。如果可能的话,因为这是同一个模型,只是不同的日期范围看看曼纽尔的答案底部,我相信这会解决你的问题。