2009-09-09 18 views
47

:throughオプションを使用すると、明らかにdependent => destroyは無視されます。dependent => "has_many through"アソシエーションで破棄する

だから私はこの...

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

を持っている...しかし、コメントを削除すると、削除されたばかり関連付けられcomment_userレコードにはなりません。

:throughを使用すると、カスケード削除にはどのような方法が推奨されますか?

おかげどうやら

答えて

96

:依存は無視されていません!

本物の問題は、私が今Comment.destroy(id)を使用してCommentオブジェクトを読み込んでdestroy()を呼び出すのに対し、Comment.delete(id)をdbに直接呼び出すことでした。これは:dependent => :destroyを受け取り、すべてがうまくいきます。

+0

を!私は 'depend::destroy'を使っていても外部キーエラーを受け取っていた以外は同様の問題がありました。問題は、obj.destroyの代わりに 'obj.delete'を使用していたため、扶養家族が削除されなかったため、完全性エラーです。 –

11

元のポスターのソリューションは有効ですが、このテーブルのID列がある場合にのみ有効です。私は、多対多のテーブルを2つの外部キーだけにすることを好むが、カスケードするための移行テーブル定義から "id:false"を削除しなければならなかった。この機能を持つことは、テーブルにID列を持たないことよりもはるかに重要です。

+0

ありがとう!私はちょうど半日を自分で考えようと過ごしました。 – Tintin81

+2

あなたは本当のmvp – jed

5

あなたはポリモーフィックな関連を持っている場合は、あなたがそうのようなものを言っ@blogofsongsが、FOREIGN_KEY属性を使用して行う必要があります。確かに

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