我只使用用户User
和UserProfile UserProfile
设置了has_one :user_profile
和belongs_to :user
模型。
但我无法理解Rails如何定义模型中定义的after_create
回调和accepts_nested_attributes_for
的执行顺序。让我们考虑这两种情况。
案例1:
class User < ActiveRecord::Base
has_one :user_profile
accepts_nested_attributes_for :user_profile
after_create :test_test
end
现在,如果我通过控制台创建用户(使用user_profile_attributes哈希),则会在创建用户及其用户配置文件后触发after_create
回调。
案例2:
如果after_create
位于顶部,
class User < ActiveRecord::Base
after_create :test_test
has_one :user_profile
accepts_nested_attributes_for :user_profile
end
在创建用户之后但在创建用户配置文件之前触发回调。
这是预期运作的方式吗? Rails在这里做什么?执行顺序是否仅由代码的顺序决定?
我从哪里开始深入研究或调试这个?
答案 0 :(得分:10)
模型中声明的顺序可能会影响代码的执行顺序。这是各种怪异事物的来源。 (例如,当前回调定义和has_and_belongs_to_many关联依赖于顺序:https://github.com/rails/rails/pull/8674)
要调试问题,您需要浏览rails源。由于你的问题与执行顺序,回调和嵌套属性有关,我首先要阅读:
这为您提供了深入挖掘的必要背景。您会注意到accepts_nested_attributes_for
调用add_autosave_association_callbacks
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173
此方法添加after_create
回调,据我所知,回调按定义顺序执行。