0

私は次のモデルを持っています:

class PhoneNumber < ActiveRecord::Base
  has_many :personal_phone_numbers, :dependent => :destroy
  has_many :people, :through => :personal_phone_numbers
end

私は、delayed_job キューでアクションを実行するようにオブザーバーを設定したいと考えています。これはほとんどの場合機能しますが、1 つの例外があります。before_destroy ウォッチャーが、電話番号が破棄される前に、その電話番号に関連付けられている人々を取得するようにしたいと考えています。遅延ジョブが実際に機能するのは、これらの人々です。

問題は、電話番号が破棄されると、最初:personal_phone_numbersにレコードが破棄され、電話番号を破棄しようとするとオブザーバーがトリガーされることです。その時点で、手遅れです。

依存レコードが削除されるに破棄アクションを監視する方法はありますか?

4

5 に答える 5

0

これは理想的ではありませんが:dependent => :destroypersonal_phone_numbersリレーションシップからを削除し、操作後にオブザーバーで手動で削除することができます。

ただし、この問題はコードの臭いを示している可能性があると思います。なぜあなたは電話番号のオブザーバーの人々を操作しているのですか?そのロジックは、結合モデルでより適切に処理されるようです。

于 2012-08-06T22:32:39.863 に答える
0

モデルで before_destroy コールバックを使用して、データを取得し、親を破棄する前に必要な操作を実行できます。この例のようなものが探しているはずです:

class Example < ActiveRecord::Base
before_destroy :execute_random_method


private

def execute_random_method
  ...
end
handle_asynchronously :execute_random_method
于 2012-08-07T23:04:04.277 に答える
0

破棄呼び出しをインターセプトするために alias_method を使用しますか?

class PhoneNumber < ActiveRecord::Base
  has_many :personal_phone_numbers, :dependent => :destroy
  has_many :people, :through => :personal_phone_numbers

  alias_method :old_destroy, :destroy

  def destroy(*args)
    *do your stuff here*
    old_destroy(*args)
  end
end
于 2012-08-06T22:44:33.507 に答える