0

has_many 宣言の多くを拡張して、関連付けをフィルター/結合/プリロードしました。has_many :through リレーションシップを宣言するときに、これらの拡張機能のいくつかを再利用したいと思います。これは可能ですか?別のアプローチをとるべきですか?

例:

ライブラリモデルにこれがあります:

class Library < ActiveRecord::Base
  has_many :meals, :dependent => :destroy do
    def enabled
      where(:enabled => true)
    end
  end
end

私の食事モデルにはこれがあります:

class Meal < ActiveRecord::Base
  has_many :servings, :inverse_of => :meal, :dependent => :destroy
end

ライブラリに多くのサービングがあることを望みますが、有効な食事からのみです。これを行うにはいくつかの方法があります。

# repeat the condition in the has_many :servings declaration
class Library < ActiveRecord::Base
  has_many :servings, :through => :meals, :conditions => ["meals.enabled = ?", true]
end

# declare a different meals association for only the enabled meals
class Library < ActiveRecord::Base
  has_many :enabled_meals, :class_name => "Meals", :conditions => [:enabled => true]
  has_many :servings, :through => :enabled_meals
end

既存の :meals 宣言の拡張子を再利用する方法はありますか? (def は最初のコード ブロックで有効になっています)

4

1 に答える 1

0

http://blog.zerosum.org/2007/2/8/activerecord-association-extensions.htmlで説明されているように、activerecord-association-extensionsを使用したいように見えます。

私はそれを試していませんが、あなたはできると思います:

  module LibraryMealExtensions
  def enabled?
    where(:enabled=>true)
  end

  def standard_includes
    includes(:servings)
  end
end

class Library < ActiveRecord::Base
  has_many :meals, :dependent => :destroy, :extend=>LibraryMealExtensions
  has_many :servings, :through => :meals, :extend=>LibraryMealExtensions
end

そこにある「enabled=>true」についてはよくわかりません-あなたは言わなければならないかもしれません

where("meals.enabled=true")

エイリアスとの混同のb/c。

于 2012-12-05T21:00:58.590 に答える