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方法を置くことができる
この場合、親MyTaskオブジェクトの3つのジョブを破棄したとします。このコールバックは3回実行されます。また、ジョブの作成や更新にも実行されません。つまり、私はまだbefore_saveコールバックを持つ必要があります。 これは私にとって非常に効率的ではないようです。それは必要な仕事をするのでアップアップ。 – arunt
はい、私はあなたと同じケースを持っています。私はafter_saveを使用して作成と更新を行いますが、効率的ではないようです(はい、私は同意します)。親は直接更新する必要があります。私は開いているし、このようなケースが多いので、トランザクションを保存して効果的な別のオプションがある場合は、このケースを知りたい – widjajayd