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

看起来很像您想使用 activerecord-association-extensions,如此处所述http://blog.zerosum.org/2007/2/8/activerecord-association-extensions.html

我还没有尝试过,但我认为你可以这样做:

  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

不确定那里的“启用=>真” - 你可能不得不说

where("meals.enabled=true")

b/c 与别名混淆。

于 2012-12-05T21:00:58.590 回答