私はUser
とというモデルのユーザhas_one :user_profile
とUserProfile belongs_to :user
という単純な設定をしています。Rails - 作成後コールバックとネストされたアトリビュートの実行シーケンス
しかし、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は内部的に何をしていますか?実行順序はコードの順序で単純に決定されますか?
ここで深く掘り下げたりデバッグしたりできますか?
私はこれを再度テストします。コールバックの形式でのコードの順序は、実行順序とは関係ありません。 – Rabbott
@Rabbott - ありがとう! – prasvin
'inverse_of'を使うと、依存関係を解決し、作成時や保存時に問題を解決するのに便利です。例えば'has_one:user_profile、inverse_of::user' – ybart