0

ActiveRecord::Base を継承する Commentable クラスと、Commentables を継承する Event クラスがあります。

これらのクラスの両方で destroy メソッドを上書きし、Event.distroy は super を呼び出します。ただし、いくつかの予期しないことが起こります。具体的には、イベントの has_and_belongs_to_many 関連付けが削除されます。Commentables と Event クラスの間にいくつかのモジュールが含まれているため、これが発生していると思いますが、これを止める方法があるかどうかはわかりません。

簡略化されたコードは次のとおりです。

class Commentable < ActiveRecord::Base
  has_many :comments

  def destroy
    comments.destroy_all
    self.deleted = true
    self.save!
  end

end

class Event < Commentable
  has_and_belongs_to_many :practitioners, :foreign_key => "commentable_id"

  def destroy
    #some Event specific code
    super
  end

end

データベースから行を削除したくありません。「削除済み」フラグを設定するだけです。また、関連付けを削除したくありません。ただし、Event.destroy と Commentable.destroy の間のどこかで、他のいくつかのレール コードが has_and_belongs_to_many テーブルのレコードを破棄します。

なぜこれが起こっているのか、それを止める方法はありますか?

4

2 に答える 2

5

モデルでdestroy をオーバーライドする必要はありません。実際に destroy 呼び出しをキャンセルするコールバックをCommentable追加するだけです。例えば:before_destroyfalse

class Commentable < ActiveRecord::Base
 # ... some code ...
  before_destroy { |record|
    comments.destroy_all
    self.deleted = true
    self.save!
    false
  }
 # ... some code ...
 end

同じことがEventモデルにも当てはまります。destroy メソッド自体をオーバーライドせずにコールバックを追加するだけです。

利用可能なコールバックの詳細については、こちらをご覧ください。

于 2012-12-02T07:54:26.497 に答える