轨道,覆盖关联方法



好吧,我有一个具有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返回一组可能属于也可能不属于foobars

这是一个巨大的危险信号。

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

从理论上讲,您所要求的是可能的 — 只需从has_many块中取出示例中的def bars节,并将其置于与所有其他方法定义相同的级别。但这根本就没有意义。

Bar.wherescope都是为了做你所要求的而生的。如果您不想将查询限制为给定的Foo,请将Foo排除在外。

相关内容

最新更新