2012-03-09 19 views
12

私は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は内部的に何をしていますか?実行順序はコードの順序で単純に決定されますか?

ここで深く掘り下げたりデバッグしたりできますか?

+1

私はこれを再度テストします。コールバックの形式でのコードの順序は、実行順序とは関係ありません。 – Rabbott

+0

@Rabbott - ありがとう! – prasvin

+0

'inverse_of'を使うと、依存関係を解決し、作成時や保存時に問題を解決するのに便利です。例えば'has_one:user_profile、inverse_of::user' – ybart

答えて

10

モデル内の宣言の順序は、コードの実行順序に影響を与える可能性があります。これはさまざまな奇妙なものの源です。 (現在、コールバックの定義やhas_and_belongs_to_manyの関連付けは、次のように異なります。https://github.com/rails/rails/pull/8674

この問題をデバッグするには、レールソースを参照する必要があります。あなたの問題は、実行順序、コールバックと私は上に読み込むことによって開始すると、ネストされた属性に関係していますので:

これは、あなたに必要な背景を与えますより深く掘り下げるがadd_autosave_association_callbacksにコールされますhttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 このメソッドはafter_createコールバックを追加し、コールバックは定義順に実行されることがわかります。

+2

ありがとうございます。これはまさに私が走っていたものでした。私のモデルは、after_createコールバックを実行していて、has_many定義の前に配置されていました。 after_createでは、update_attribute(ある場合)を使用して属性を更新していました。これは、has_manyチェーンの残りの部分が私のhas_many:throughリレーションシップが何も保存していないことを意味する更新に失敗させていました。私の関係定義の後でafter_createを動かすことで問題が解決されました。クレイジー。ありがとうございました!!! –

+0

このポストで議論された(あまりあいまいではない)問題は事です。私はそれに噛まれ、上記のように、私のモデルで、 'after_update'コールバック定義をhas_many&accepts_nested_attributes_for定義の下に移動することで問題を解決しました。 –

+0

@DonnFelkerはい、私の 'accept__nested_attributes'の下に私の' after_create'を動かすことも、私のためにそれを固定しました、ありがとう。 – eggie5

関連する問題