我有一个与模型RegularOpeningHour(dayOfWeek: integer)
关联的模型OpeningTime(opens: time, closes: time)
。 RegularOpeningHour
与OpeningTime
具有1:n的关系,因此特定的一天可以有很多营业时间。
(我知道我可以在RegularOpeningHour中只包含一个带有“ opens”和“ closes”的条目,但由于其他原因,我需要进行此拆分)
现在,我需要一种open?
-方法,该方法返回是否营业。我在模型文件 regular_opening_hour.rb 中尝试了以下操作:
def open?
RegularOpeningHour.where(dayOfWeek: Time.zone.now.wday).any? { |opening_hour| opening_hour.opening_times.where('? BETWEEN opens AND closes', Time.zone.now).any? }
end
不幸的是,这不起作用。有什么解决办法吗?
答案 0 :(得分:2)
如何?
def open?
joins(:opening_times)
.where(dayOfWeek: Time.current.wday)
.where("opens <= :time AND closes >= :time", time: Time.current)
.any?
end
编辑:联接中缺少':'
答案 1 :(得分:1)
由于您拥有has_many
与RegularOpeningHour
的{{1}}关联,因此可以使用如下所示的联接查询。
OpeningTime
答案 2 :(得分:1)
您可以创建一些作用域,以使选择打开的OpeningTime
和打开RegularOpeningHour
的麻烦程度降低。这使得创建给定选择更加容易。
class OpeningTime < ApplicationRecord
# ...
belongs_to :regular_opening_hour
def self.open
time = Time.current
where(arel_table[:opens].lteq(time).and(arel_table[:closes].gteq(time)))
end
# ...
end
class RegularOpeningHour < ApplicationRecord
# ...
has_many :opening_times
def self.open
where(
dayOfWeek: Time.current.wday,
id: OpeningTime.select(:regular_opening_hour_id).open,
)
end
# ...
end
def open?
RegularOpeningHour.open.any?
end