如何检查关联的模型在Rails 5中是否有条目?

时间:2018-08-07 05:47:35

标签: ruby-on-rails ruby-on-rails-5

我有一个与模型RegularOpeningHour(dayOfWeek: integer)关联的模型OpeningTime(opens: time, closes: time)RegularOpeningHourOpeningTime具有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

不幸的是,这不起作用。有什么解决办法吗?

3 个答案:

答案 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_manyRegularOpeningHour的{​​{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