ruby-on-rails – Rails关联未正确加载

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails关联未正确加载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的父类有时不会在子节点的after_save回调中加载它的所有子节点.

我有两个型号:

class Parent < ActiveRecord::Base
  has_many :children

  def update_something
    # explained below
  end
end

class Child < ActiveRecord::Base
  belongs_to :parent

  after_save :tell_parent_to_update

  def tell_parent_to_update
    parent.update_something
  end
end

我有一个测试我正在运行它,它只检查2件事. parent.children.count和parent.children.length.两者都应该是4.我意识到计数有时是不同的,但(据我所知)它不应该在这里.

如果我定义update_something只是迭代孩子:

def update_something
  children.each do |child|
  end
end

测试失败 – 循环将执行一次(并将返回单个子节点的数组 – 创建的第一个子节点).

否则,我可以放任何代码,只要它没有提到孩子,它会工作.这就像对孩子的呼叫导致关联加载错误的东西.

强制重新加载修复它:

def update_something
  children(true).each do |child|
  end
end

但这很hacky,如果可能的话我宁愿修复root问题.

这是我的错误,还是铁轨错误(如果有的话,我可以做些什么来解决这个问题)?

我怀疑这很重要,但这是一个使用sqlite3的测试环境.虽然如果我在单个开发控制台会话中创建和测试记录,它也会在开发环境中失败.

解决方法

在黑暗中刺,但你可能需要 inverse_of,我认为相关的对象存储在同一个内存块中,而不是标准方法创建的不同块:
#app/models/parent.rb
class Parent < ActiveRecord::Base
  has_many :children,inverse_of: :parent
  ...
end

#app/models/child.rb
class Child < ActiveRecord::Base
  belongs_to :parent,inverse_of: :children
  ...
end

根据我自己的经验,我发现inverse_of允许您调用其他模型中的关联数据.例如,调用不带inverse_of的parent.update_something会导致错误(如果未显式定义父级),或者必须再次构建父对象.

有一个good write-up here.

如果没有帮助,我会删除答案.

原文链接:https://www.f2er.com/ruby/269655.html

猜你在找的Ruby相关文章