【问题标题】:Rails scope filter by date rangeRails范围过滤器按日期范围
【发布时间】:2015-06-23 21:35:01
【问题描述】:

有很多与 Rails 日期范围问题有关的问题,但我的问题稍微复杂一些。

我有两个模型:house 和 booking。 A House has_many 预订。 Booking 有两个日期格式的属性: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]
}}

如何将其转移到我的问题上?

【问题讨论】:

  • 你应该使用Bookable Gem
  • @AntarrByrd 感谢您的建议。我已经有了自己的模型,我想保持简单,只做范围。
  • 您可以随时查看它是如何完成的there

标签: ruby-on-rails ruby rails-activerecord


【解决方案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)

我继续删除了 &gt;=&lt;= 运算符以支持 &gt;&lt; 以明确显示这些预订超出给定范围,但您可以根据需要进行调整!

更新

将查询更改为使用#includes 而不是#joins,因为我们正在查询附加的表。

【讨论】:

  • 你能解释一下“references(:bookings)”的作用吗?我目前正在使用没有这部分的代码并且仍在测试。
  • 现在我遇到一个问题,如果多个预订满足范围要求,同一个房子会显示多次。例如,房屋 1 有 4 个预订。它们都不与给定范围重叠。结果将是房屋 1 被列出 4 次。
  • 我已更新我的答案,将 #uniq 方法附加到范围,因此只返回任何给定房屋的 uniq 实例。
  • 代码在几个测试用例后完美运行。非常感谢!
【解决方案2】:

是的,可以通过范围进行此查询。将此作用域放入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')

【讨论】:

  • 感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多