好吧,我有一个具有has_many关联的模型:
class Foo < ApplicationRecord
has_many :bars
end
现在,我知道如果我调用foo.bars
它会加载foo_id
foo.id
的所有柱线,对吧?但是我想覆盖它,以便我可以基于其他参数加载bars
。
这个答案有点教如何覆盖<< (value)
方法。但是,我不知道如何在我的情况下应用它。
我该怎么做??像这样:
class Foo < ApplicationRecord
has_many :bars do
def bars
self.owner = Bar.where(date: foo.date) #just an example
end
end
end
???
您可以像这样对 has_many
属性设置条件
has_many :bars, -> { where(active: true) }
指南中对此进行了更多介绍(第 4.3.3 节)
听起来您正在寻求一种方法来覆盖关联 getter,以便它像一个简单的范围或where
查询一样工作——也就是说,您希望foo.bars
返回一组可能属于也可能不属于foo
的bars
。
这是一个巨大的危险信号。
将#bars
关联 getter 方法作为Foo
的实例方法的全部意义在于返回与单个模型对象相关的bars
列表。如果您想要不同的东西,请在其他地方定义行为。
从理论上讲,您所要求的是可能的 — 只需从has_many
块中取出示例中的def bars
节,并将其置于与所有其他方法定义相同的级别。但这根本就没有意义。
Bar.where
和scope
都是为了做你所要求的而生的。如果您不想将查询限制为给定的Foo
,请将Foo
排除在外。