有很多与铁路日期范围问题相关的问题,但我的问题有点复杂。
我有两种模式:房子和预订。一个房子有很多预订。预订具有日期格式的两个属性:check_in和check_out。
我想要实现的目标:提供有效的日期范围,显示在此范围内可用的所有房屋。详细说明:
可以使用rails scope吗?
更新
我发现下面的代码可以检查重叠的范围日期间隔。
named_scope :overlapping, lambda { |interval| {
:conditions => ["id <> ? AND (DATEDIFF(start_date, ?) * DATEDIFF(?, end_date)) >= 0", interval.id, interval.end_date, interval.start_date]
}}
如何将此问题转移到我的问题?
答案 0 :(得分:1)
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
,因为我们正在查询附表。
答案 1 :(得分:1)
是的,可以通过范围进行此查询。将此范围放在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')