根据关系的计算字段确定查询范围?

时间:2013-01-10 19:05:20

标签: ruby-on-rails mongoid

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

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

但是,我如何确定查询的范围,例如,获取可用点的事件日期?即。

Location.event_dates.where(available_spots > 0)

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

好吧,看起来答案隐藏在普通视线中(照常),在Mongoid文档的Extensions部分下:

Relations - Common Behavior: Extensions

两部分答案:

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

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

要“scopify”(在本质上),我想要的是扩展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

Et瞧。