Ruby on rails Rails关联未正确加载

Ruby on rails Rails关联未正确加载,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我的父类有时在子类进行保存回调后,不会在中加载其所有子类 我有两种型号: 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 d

我的父类有时在子类进行保存回调后,不会在
中加载其所有子类

我有两种型号:

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
测试失败——循环将执行一次(并返回单个子循环的数组——创建的第一个子循环)

否则,我可以放任何代码,只要它没有提到
子类
,它就会工作。这就像给孩子们打电话导致协会加载错误的东西一样

强制重新加载将修复它:

def update_something
  children(true).each do |child|
  end
end
但这是一个骇客,如果可能的话,我宁愿修复根本问题

这是我的bug,还是rails bug(如果是的话,我能做些什么来解决这个问题)


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

暗中插入,但您可能需要它,我相信它将相关对象存储在同一内存块中,而不是标准方法将创建的不同块:

#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
#app/models/parent.rb
类父级
根据我自己的经验,我发现
逆_允许调用其他模型中的关联数据。例如,调用
parent.update\u something
而不调用
inverse\u
会导致错误(如果未明确定义
parent
),或者必须再次构建
parent
对象

有一个

--


如果答案不起作用,我将删除它。

这可能是因为在运行“告诉家长更新”之前,家长的孩子在代码中的某个点上急于加载

parent.children.count将运行SQL查询并返回数据库中存在的子数组的长度,而parent.children.length将返回子数组的长度(可能已经加载)


我建议您手动尝试从rails控制台保存1个children对象,并查看update_something中的子对象的长度和计数是否相同。如果是,你的测试可能会失败,因为之前有一些代码。

children.each do | child |
children.each do | child |
?可能与关键字有关,只是猜测而已。起初我也这么认为,但在真正的代码中,它现在非常孤立,模型/方法的实际名称是非常特定于领域的,不幸的是,它们不是关键字。这是您所说的测试环境。在dev中也会失败吗?在检查
parent.children.length
时尝试重新加载对象,在测试中使用它-
parent.reload.children.length
。这应该给你正确的长度。我相信在测试环境中,您的父对象只被加载一次,并且在加载到父对象后对其子对象所做的每一次更改都不会在父对象上看到,除非您重新加载iTunes并没有修复它。根据这篇文章和我在网上的发现,从rails 4.1(我是4.2)开始,它会自动处理这个问题。保留这个答案是很有用的,以防将来会有人知道。好的,谢谢你的提醒。我会留给后人的!
#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