Rails,覆盖关联方法

时间:2017-01-14 20:20:06

标签: ruby-on-rails associations

好吧,我有一个带有has_many关联的模型:

class Foo < ApplicationRecord
  has_many :bars
end

现在,我知道如果我致电foo.bars,它会加载foo_idfoo.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

???

2 个答案:

答案 0 :(得分:3)

您可以像{/ p>这样在has_many属性上设置条件

has_many :bars, -> { where(active: true) } 

the guides (section 4.3.3)

中的更多内容

答案 1 :(得分:0)

听起来你正在寻找一种覆盖关联吸气剂的方法,以便它就像一个简单的scopewhere query - 即,你希望foo.bars返回一组bars,可能属于也可能不属于foo

这是巨大的红旗。

#bars关联getter方法作为Foo实例方法的重点是返回与bars 相关的列表单个模型对象。如果您想要不同的东西,请在其他地方定义行为。

从理论上讲,您所要求的是可能的 - 只需从您的示例中取出def bars块中的has_many节,并将其放在与所有其他方法定义相同的级别上。但其中没有任何意义。

Bar.wherescope旨在满足您的需求。如果您不希望将查询限制为给定Foo,请将Foo保留在其中。