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

しかし、クエリの範囲を限定して、たとえばイベントの日付と利用可能なスポットを取得するにはどうすればよいでしょうか? すなわち

Location.event_dates.where(available_spots > 0)

available_spotsは計算された値であり、 の実際のデータベース フィールドではないため、それは不可能のEventDateようです。それらの計算方法をDB自体に追加することは避けたいと思っていましたが、それが唯一の方法である場合....

前もって感謝します!

4

1 に答える 1

1

わかりました、答えは (いつものように) Mongoid ドキュメントの Extensions セクションの下に隠れていたようです:

リレーション - 一般的な動作: 拡張機能

2 つの部分の答え:

まず、私が望むメソッドは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 に答える