Rails范围按日期范围过滤
有关轨道日期范围问题的问题很多,但我的问题有点复杂。
我有两个模型:房子和预订。 一个房子有很多预订。 预订在日期格式中有两个属性:check_in和check_out。
我想要实现的目标:提供有效的日期范围,显示在此范围内可用的所有房屋。 详细地:
- 该范围的开始日期不应在任何预订中。
- 该范围的结束日期不应在任何预订中。
- 开始和结束之间不应该有任何预订。
可以使用导轨示波器完成吗?
更新:
我发现下面的代码可以检查重叠的范围日期间隔。
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
,因为我们正在查询附加的表。
是的,可以通过范围进行此查询。 将此范围放在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 4,使用Model.where(related_model_id:1)检索了许多记录,如何在单个视图中显示每个记录?
- 将参数添加到范围
- Rails从两个表连接:如何选择属性
- 在Rails中,我可以通过委托方法订购查询吗?
- 在Rails 3 / ActiveRecord中构建LIKE查询时,一种正确的方法来转义%%
- 通过以下方式进行多对多:从Associations :: CollectionProxy到AssociationRelation
- 从ActiveRecord / Rails查询中检索单个记录
- Ruby Object#id警告和Active Record
- Ruby on Rails:具有多个外键的模型关联