1

假设我有以下(简化的)数据模型:

class Location
  include Mongoid::Document

  has_many :event_dates
end

class EventDate
  include Mongoid::Document

  has_many :event_sessions
  belongs_to :location

  def total_spots
    self.event_sessions.sum("max_participants")
  end

  def booked_spots
    self.event_sessions.sum("participants_count")
  end

  def available_spots
    self.total_spots - self.booked_spots
  end
end

class EventSession
  include Mongoid::Document
  belongs_to :event_date

  field :max_participants
  field :participants_count
end

我知道可以简单地获得所有地点的活动日期:

Location.event_dates

但是,我如何才能将查询范围限定为仅获取例如具有可用位置的事件日期?IE

Location.event_dates.where(available_spots > 0)

由于available_spots是计算值而不是 的实际数据库字段EventDate,因此这似乎是不可能的。我希望避免将这些计算方法添加到数据库本身,但如果这是唯一的方法......

提前致谢!

4

1 回答 1

1

好的,看起来答案隐藏在视线中(像往常一样),在 Mongoid 文档的 Extensions 部分下:

关系 - 常见行为:扩展

两部分答案:

首先,我想要的方法是select,不是where,所以虽然我不能做我上面提出的,我可以做:

Location.event_dates.select {|date| date.available_spots > 0}

为了“确定”(本质上),我想要扩展 Location 中定义的关系,如下所示:

class Location
  has_many :event_dates do
    def with_available_spots
      @target.select {|date| date.available_spots > 0}
    end

所以现在我可以简单地调用:

Location.event_dates.with_available_spots

等等。

于 2013-01-10T20:14:53.827 回答