14

だから私は、含まれる関連付けにスコープを適用したいというクレイジーなアイデアを思いつきました。これは私が理解したものであり、うまく機能しているようです:

class Event < ActiveRecord::Base
  has_many :races
  has_many :bad_races, :conditions => Race.bad_medals_sql, :class_name => "Race"
end

class Race < ActiveRecord::Base
  def self.bad_medals_sql
    arel_table[:prizes].eq('medals').to_sql
    # This returns a string
    # "`races`.`prizes` = 'medals'"
  end

  def self.bad_medals
    where(bad_medals_sql)
  end
end

Event.includes(:bad_races)
Reloading...
  Event Load (0.4ms)  SELECT `events`.* FROM `events`
  Race Load (0.5ms)  SELECT `races`.* FROM `races` WHERE (`races`.event_id IN (1,2,3,4) AND (`races`.`prizes` = 'medals'))

問題は、それが本当に鈍いということです。Race でスコープを定義し (他の場所で使用するため)、それを Event の関連付けで使用するには、Race で 2 つのメソッドが必要です。スコープごとに。

パターンをプラグインなどにラップできると確信していますが、可能であればネイティブの AR/ARel を使用したいと考えています。それを行うためのアイデアはありますか?

4

3 に答える 3

7

このコードは複雑すぎるようです。賞品として「メダル」のみを含むレースを含むすべてのイベントを取得することが目標であると仮定すると、単純なscope作業ではないでしょうか?

class Event < ActiveRecord::Base
  has_many :races
  scope :bad_races, includes(:races).where("races.prizes=?", "medals")
end

class Race < ActiveRecord::Base
  belongs_to :event
end

Event.bad_races次に、悪いレースを取得するために実行できます。

于 2011-02-01T05:30:13.307 に答える