13

我对User和 UserProfile进行了简单的设置User和建模。UserProfilehas_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 在这里内部做什么?执行顺序是否简单地由代码的顺序决定?

我从哪里开始深入挖掘或调试呢?

4

1 回答 1

11

模型中声明的顺序会影响代码的执行顺序。这是各种奇怪事物的来源。(例如,当前回调定义和 has_and_belongs_to_many 关联是顺序相关的:https ://github.com/rails/rails/pull/8674 )

要调试问题,您需要浏览 rails 源代码。由于您的问题与执行顺序、回调和嵌套属性有关,我将首先阅读:

这为您提供了深入挖掘的必要背景。您会注意到对https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173accepts_nested_attributes_for的调用 此方法添加了一个回调,据我所知,回调是按顺序执行的的定义。add_autosave_association_callbacks after_create

于 2013-01-02T13:36:40.250 回答