だけ

2017-07-21 4 views
1
class MyTask < ApplicationRecord 
    has_many :jobs, as: :ownerable, dependent: :destroy 
    accepts_nested_attributes_for :jobs, allow_destroy: true 

    before_save :set_some_data 
end 

class Job < ApplicationRecord 
    belongs_to :ownerable, polymorphic: true, optional: true 
end 

で子レコードを破壊した後、コールバックを実行します。set_some_data方法、我々は実際には、実際に(ちょうどself.column_name = calculated_valueをMyTaskにオブジェクトに属するすべてのジョブから値を取り、いくつかの計算を実行し、列に結果を保存します実際にsaveを呼び出さない)。だけ

問題は、列の更新が、破棄マークされたジョブの前に発生することです。すなわち、の"_destroy" => 1です。そして明らかに、削除されたジョブのデータが含まれていますが、これは間違っています。

after_save :set_some_data 

def set_some_data 
    #Do stuff 
    # WARNING: Don't use any method that will trigger an after_save callback. Infinite loop otherwise. 
    self.update_columns(column_name: calculated_value) 
end 

それは私が欲しいものを行いますに変更コールバック -

は、私は現在、次のことをやっています。しかしこれは良い解決策ですか?よりよい選択肢を提案できますか?あなたはafter_destroyとでこれを行うと、子が削除するとき、これは(仕事を)確認しますjob.rb方法を置くことができる

答えて

1

それはあなたは、より詳細なコールバック

class Job < ApplicationRecord 
    belongs_to :ownerable, polymorphic: true, optional: true 

    after_destroy :update_parent 


    def update_parent 
    # check your parent model 
    self.ownerable.update_columns(column_name: calculated_value) 
    end 
end 

値を更新するために親を呼び出しますチェックが可能this

+0

この場合、親MyTaskオブジェクトの3つのジョブを破棄したとします。このコールバックは3回実行されます。また、ジョブの作成や更新にも実行されません。つまり、私はまだbefore_saveコールバックを持つ必要があります。 これは私にとって非常に効率的ではないようです。それは必要な仕事をするのでアップアップ。 – arunt

+0

はい、私はあなたと同じケースを持っています。私はafter_saveを使用して作成と更新を行いますが、効率的ではないようです(はい、私は同意します)。親は直接更新する必要があります。私は開いているし、このようなケースが多いので、トランザクションを保存して効果的な別のオプションがある場合は、このケースを知りたい – widjajayd