【问题标题】:Rails, override association methodRails,覆盖关联方法
【发布时间】:2017-01-14 20:20:05
【问题描述】:

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

class Foo < ApplicationRecord
  has_many :bars
end

现在,我知道如果我调用foo.bars,它会加载foo_idfoo.id 的所有条形,对吗?但我想覆盖它,这样我就可以根据其他参数加载bars ..

这个answer 有点教如何覆盖&lt;&lt; (value) 方法。但是,我不知道如何在我的情况下应用它。

我怎么能这样做?像这样的:

class Foo < ApplicationRecord
  has_many :bars do
    def bars
      self.owner = Bar.where(date: foo.date) #just an example
    end
  end
end

???

【问题讨论】:

  • 仍然不清楚您要做什么。您是否希望关联基于 foos.date = bars.date 而不是 foos.bar_id = bars.id
  • 是的!类似的东西..当我打电话给foo.bars时,我希望它返回给定日期的所有条形图,而不是属于foo的所有条形图。
  • 你真的想要一个正式的协会吗?也许您只是在寻找一种没有所有关联机制的简单方法。
  • 好吧,我明白你在说什么,但我想使用 ActiveRecord 关联中的其他方法。但是更好地考虑它知道,也许我也必须覆盖大多数其他方法。无论如何..我想知道如何做到这一点只是出于好奇..

标签: ruby-on-rails associations


【解决方案1】:

您可以像这样在has_many 属性上设置条件

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

更多信息请关注the guides (section 4.3.3)

【讨论】:

  • 嗯,它确实有帮助,谢谢!!但是,我不想扩展,因为我只想搜索带有active: true 的条,而不是带有foo_id: foo.idactive: true 的所有条。找我?
  • 嗯,不完全是。您能否用更多信息更新您的问题。
【解决方案2】:

听起来您正在寻求一种方法来覆盖关联 getter,以便它像一个简单的 scopewhere query 而不是 - 也就是说,您希望 foo.bars 返回一组 bars可能属于也可能不属于foo

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

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

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

Bar.wherescope 专为满足您的要求而设计。如果您不想将查询限制为给定的Foo,则将Foo 排除在外。

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多