我的父类有时不会在子节点的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会导致错误(如果未显式定义父级),或者必须再次构建父对象.
–
如果没有帮助,我会删除答案.