Rails-コールバックとネストされた属性を作成した後の実行シーケンス
-
10-12-2019 - |
質問
私は簡単なセットアップを持っています User
と UserProfile
ユーザーとのモデル has_one :user_profile
とUserProfile belongs_to :user
.
しかし、私はRailsがどのように実行順序を定義するかについて頭を包むことができません after_create
コールバックと accepts_nested_attributes_for
私のモデルで定義されています。これらの2つのケースを考えてみましょう。
ケース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は内部的に何をしていますか?実行シーケンスは単にコードの順序によって決定されますか?
これを深く掘り下げたりデバッグしたりするには、どこから始めますか?
解決
モデル内の宣言の順序は、コードの実行順序に影響を与える可能性があります。これは様々な奇妙なことの源です。(たとえば、現在のコールバック定義とhas_and_belongs_to_many関連付けは順序に依存します: https://github.com/rails/rails/pull/8674 )
問題をデバッグするには、railsソースを参照する必要があります。あなたの問題は実行順序、コールバック、ネストされた属性に関係しているので、私は読むことから始めます:
- https://github.com/rails/rails/blob/master/activerecord/lib/active_record/nested_attributes.rb#L256
- https://github.com/rails/rails/blob/master/activerecord/lib/active_record/callbacks.rb#L302
- https://github.com/rails/rails/blob/master/activemodel/lib/active_model/callbacks.rb#L98
これにより、より深く掘り下げるために必要な背景が得られます。あなたはそれに気づくでしょう 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
コールバックと私が知る限り、コールバックは定義の順に実行されます。