好吧,我有一个带有has_many关联的模型:
class Foo < ApplicationRecord
has_many :bars
end
现在,我知道如果我致电foo.bars
,它会加载foo_id
为foo.id
的所有栏,对吗?但我想覆盖它,以便我可以根据其他参数加载bars
..
这种answer教会如何覆盖<< (value)
方法。但是,我不知道如何应用它。
我怎么能这样做?像这样:
class Foo < ApplicationRecord
has_many :bars do
def bars
self.owner = Bar.where(date: foo.date) #just an example
end
end
end
???
答案 0 :(得分:3)
您可以像{/ p>这样在has_many
属性上设置条件
has_many :bars, -> { where(active: true) }
中的更多内容
答案 1 :(得分:0)
听起来你正在寻找一种覆盖关联吸气剂的方法,以便它就像一个简单的scope或where
query - 即,你希望foo.bars
返回一组bars
,可能属于也可能不属于foo
。
这是巨大的红旗。
将#bars
关联getter方法作为Foo
的实例方法的重点是返回与bars
相关的列表单个模型对象。如果您想要不同的东西,请在其他地方定义行为。
从理论上讲,您所要求的是可能的 - 只需从您的示例中取出def bars
块中的has_many
节,并将其放在与所有其他方法定义相同的级别上。但其中没有任何意义。
Bar.where
和scope
旨在满足您的需求。如果您不希望将查询限制为给定Foo
,请将Foo
保留在其中。