gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:50 25 4
gpt4 key购买 nike

我的父类有时不会在子类的 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

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

如果我定义 update_something 只是迭代 children:

def update_something
children.each do |child|
end
end

测试失败——循环将执行一次(并将返回单个 child 的数组——创建的第一个 child)。

否则,只要不提及children,我就可以输入任何代码,并且它会起作用。这就像调用 children 导致关联加载错误的东西。

强制重新加载修复它:

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

但这是 hacky,如果可能的话,我宁愿解决根本问题。

这是我的错误还是 Rails 错误(如果是,我能做些什么来解决这个问题)?

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

最佳答案

暗中刺杀,但你可能需要inverse_of ,我相信它将关联的对象存储在同一个内存块中,而不是标准方法会创建的不同 block :

#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 允许您调用其他模型中的关联数据。例如,调用 parent.update_something without inverse_of 会导致错误(如果 parent 未明确已定义),或者必须再次构建 parent 对象。

有一个 good write-up here .

--

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

关于ruby-on-rails - Rails 关联未正确加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com