Rails 按日期范围筛选范围
Rails scope filter by date range
有很多问题与 rails 日期范围问题有关,但我的问题稍微复杂一些。
我有两个模型:房子和预订。 A House has_many 预订。预订有两个日期格式的属性:check_in 和 check_out。
我想要实现的目标:提供一个有效的日期范围,显示该范围内所有可用的房屋。详细:
- 范围的开始日期不应出现在任何预订中。
- 范围的结束日期不应出现在任何预订中。
- 开始和结束之间不应该有任何预订。
这可以使用 rails 范围来完成吗?
更新:
我发现下面的代码可以检查重叠的范围日期间隔。
named_scope :overlapping, lambda { |interval| {
:conditions => ["id <> ? AND (DATEDIFF(start_date, ?) * DATEDIFF(?, end_date)) >= 0", interval.id, interval.end_date, interval.start_date]
}}
如何将其转移到我的问题中?
scope :overlapping, (lambda do |start_date, end_date|
House.includes(:bookings).where("bookings.check_in < ? AND bookings.check_out > ?",
start_date, end_date).references(:bookings).uniq
end)
我继续删除了 >=
和 <=
运算符以支持 >
和 <
以明确显示这些预订超出给定范围,但是您可以根据自己的需要进行调整!
更新
更改查询以使用 #includes
而不是 #joins
,因为我们正在查询附加的 table。
是的,可以通过范围进行此查询。将此范围放入 house
模型中。
scope :overlapping, -> (start_date, end_date) {
includes(:bookings).where('bookings.check_in < ? AND bookings.check_out > ?',
start_date.to_date, end_date.to_date)
}
并调用 House.overlapping('2015-07-01', '2015-07-09')
有很多问题与 rails 日期范围问题有关,但我的问题稍微复杂一些。
我有两个模型:房子和预订。 A House has_many 预订。预订有两个日期格式的属性:check_in 和 check_out。
我想要实现的目标:提供一个有效的日期范围,显示该范围内所有可用的房屋。详细:
- 范围的开始日期不应出现在任何预订中。
- 范围的结束日期不应出现在任何预订中。
- 开始和结束之间不应该有任何预订。
这可以使用 rails 范围来完成吗?
更新:
我发现下面的代码可以检查重叠的范围日期间隔。
named_scope :overlapping, lambda { |interval| {
:conditions => ["id <> ? AND (DATEDIFF(start_date, ?) * DATEDIFF(?, end_date)) >= 0", interval.id, interval.end_date, interval.start_date]
}}
如何将其转移到我的问题中?
scope :overlapping, (lambda do |start_date, end_date|
House.includes(:bookings).where("bookings.check_in < ? AND bookings.check_out > ?",
start_date, end_date).references(:bookings).uniq
end)
我继续删除了 >=
和 <=
运算符以支持 >
和 <
以明确显示这些预订超出给定范围,但是您可以根据自己的需要进行调整!
更新
更改查询以使用 #includes
而不是 #joins
,因为我们正在查询附加的 table。
是的,可以通过范围进行此查询。将此范围放入 house
模型中。
scope :overlapping, -> (start_date, end_date) {
includes(:bookings).where('bookings.check_in < ? AND bookings.check_out > ?',
start_date.to_date, end_date.to_date)
}
并调用 House.overlapping('2015-07-01', '2015-07-09')