web-dev-qa-db-ja.com

依存=> "has_many through"アソシエーションで破棄

:throughオプションも使用している場合、明らかに依存=> destroyは無視されます。

だから私はこれを持っています...

class Comment < ActiveRecord::Base
  has_many :comment_users, :dependent => :destroy
  has_many :users, :through => :comment_users
  ...
end

...ただし、コメントを削除しても、関連するcomment_userレコードは削除されません。

:throughを使用する場合のカスケード削除の推奨アプローチは何ですか?

ありがとう

48
blogofsongs

どうやら:dependentは無視されません!

本当の問題は、dbに直接移動するComment.delete(id)を呼び出していたのに対して、Commentオブジェクトをロードしてdestroy()を呼び出すComment.destroy(id)を使用することです。これにより、:dependent => :destroyそしてすべてが順調です。

96
blogofsongs

元のポスターのソリューションは有効ですが、このテーブルにid列がある場合にのみ機能することを指摘したかったのです。多対多のテーブルは2つの外部キーのみにすることを好みますが、カスケード削除を機能させるには、移行テーブル定義から「id:false」を削除する必要がありました。この機能を持つことは、テーブルにid列を持たないことよりも確実に重要です。

11
drosis

多態的な関連付けがある場合、@ blogofsongsが言ったことを行う必要がありますが、次のようなforeign_key属性を使用します。

class User < ActiveRecord::Base
  has_many :activities , dependent: :destroy, foreign_key: :trackable_id
end
5
rizidoro