Rails - 创建回调后的执行顺序&嵌套属性

时间:2012-03-09 09:23:05

标签: ruby-on-rails callback model-associations after-create

我只使用用户User和UserProfile UserProfile设置了has_one :user_profilebelongs_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在这里做什么?执行顺序是否仅由代码的顺序决定?

我从哪里开始深入研究或调试这个?

1 个答案:

答案 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回调,据我所知,回调按定义顺序执行。