gpt4 book ai didi

mysql - 查找关联模型中日期范围内的差距 | Rails 上的 Ruby

转载 作者:行者123 更新时间:2023-11-29 02:37:55 25 4
gpt4 key购买 nike

给定以下模型:

class Room < ActiveRecord::Base  
has_many :contracts
end

class Contracts < ActiveRecord::Base
# columns
# start_date Date
# end_date Date

belongs_to :room
end

一个房间的契约(Contract)不重叠。我的问题是,我如何能够找到契约(Contract)之间的差距。一个例子:

room = Room.create
c1 = room.contracts.create(:start_date => Date.today, :end_date => 1.month.since)
c2 = room.contracts.create(:start_date => 2.months.since, :end_date => 4.months.since)
rooms = Room.with_contract_gaps #rooms == [room]

奖金回合将有可能搜索具有特定日期范围的间隙,甚至更好地将所有间隙作为散列或数组中的日期范围获取。

gaps = Room.contract_gaps
gaps # {1 => [((1month.since+1.day)..(2.months.since-1.day))]}

我已经通过谷歌搜索并找到了Inverting Date Ranges .但老实说,我真的不知道如何在这种特定情况下使用它。

如果有人有解决方案或一些有用的提示来解决这个问题,那就太好了。

最佳答案

最快的方法是使用 SQL 查询查找间隙。然而,这会很复杂并且不能很好地映射到 ActiveRecord 模型,所以我能想到的下一个最快的方法是在数据库中按时间顺序对契约(Contract)进行排序并在 Ruby 中找到差距,遍历每个结果并将房间和日期附加到数组当你遇到他们时。

但是,如果您需要更快地访问差距,或者您正在进行大量差距操作,或者如果这些差距在某种意义上是正在销售的“产品”,那么您最好使用不同的模型。 Slot 怎么样,这是最短的契约(Contract)期限(例如,一个月)?您将为接下来几年的每个房间和每个月创建插槽。每个都有 slot.available == true 开始,contract 模型的 after_save 回调设置 available = false 必要时。使用此设置,您可以更轻松地定义间隙查找器 (Room.with_available_slots):

class Contract < ActiveRecord::Base
has_many :slots
end

class Slot < ActiveRecord::Base
belongs_to :room
belongs_to :contract
end

class Room < ActiveRecord::Base
has_many :slots
has_many :contracts, :through => :slots

named_scope :with_available_slots,
:joins => :slots,
:conditions => {:slots => {:contract_id => nil}},
:select => "*, COUNT(*) AS num_slots",
:group => "room_id",
:having => "num_slots > 0"
end

此设计还有其他有用的功能,例如能够防止预订某些日期、对某些时段应用不同的定价等。它不像您的设计那么干净,但根据我的经验,它更适合真实世界的数据,因为异常(exception)情况更容易处理。

关于mysql - 查找关联模型中日期范围内的差距 | Rails 上的 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com