13

Userと UserProfileを使用したモデルの簡単なセットアップがUserあります。UserProfilehas_one :user_profilebelongs_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は内部的に何をしますか? 実行順序は単純にコードの順番で決まるのでしょうか?

これをさらに深く掘り下げたり、デバッグしたりするには、どこから始めればよいですか?

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 に答える