【问题标题】:Eager load delegate?急切的负载委托?
【发布时间】:2015-01-19 08:57:21
【问题描述】:

是否可以预先加载(通过 include() 或类似方法)委托关联?

当我尝试我希望的显而易见的解决方案时(假设 ModelA 属于 ModelB,而 ModelB 又属于 Model C):

ModelA.includes(:modelB, :modelC)

我收到一个错误,因为 ModelA 不知道 Model C。

我向 ModelA 添加了一个委托:

delegate :modelC, to: :modelB, allow_nil: false

这允许类似:

ModelA.first.modelC

但不能解决 include() 问题。

这应该怎么做?

【问题讨论】:

  • 你应该使用has_many through而不是委托:Modela has_many ModelB,ModelA has_many ModelC,通过:ModelB
  • 错误的方式:A 属于 B,B 属于 C。理想情况下,我希望通过 belongs_to,但不存在的 AFAIK。

标签: ruby-on-rails rails-activerecord


【解决方案1】:

如果我正确理解您的问题,我相信您可以使用急切加载

class ModelA
  delegate :modelC, to: :modelB, allow_nil: false
  belongs_to :modelB
  belongs_to :modelC
end

class ModelB
  has_many :modelAs
  belongs_to :modelC
end

class ModelC
  has_many :modelBs
  has_many :modelAs, through: :modelBs
end

我认为你应该能够做的是(仅供参考,我自己并没有实际运行过):

ModelA.includes(ModelB: :ModelC).first.modelC

关于这方面的一些相关信息在Rails Guides - Nested Associations HashRails api documention

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多