2011-01-06 9 views
1

私のプロジェクトでは、自己参照関係があります。自己参照協会の両側を破壊する最善の方法は何ですか?

私はUserモデルがあります:2人のユーザーが互いにピアである場合には、二つのレコードがデータベースに明らかに存在し

class Relationship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :peer, :class_name => "User" 
end 

class User < ActiveRecord::Base 
    has_many :relationships, :dependent => :destroy 
    has_many :peers, :through => :relationships 
end 

とリレーションシップ・モデル。

1人のユーザーが関係を終了する場合、の両方のレコードを破棄したいと思います。

コントローラで2回リレーションシップをロードするのではなく、これを行うより良い方法がありますか?方法の

答えて

1

のカップルが、これは

を行うことができます。まず後トリガーを削除され、データベース・不可知論の偽の約束を信じているならば、これは物事のかなり論争の方法です、しかし作品です - 本質的には、old.peer_idとold.user_idを見てから、削除を行いますが、ロールを逆にします。このルートを下りたい場合は、トリガを実装する方法としてデータベースのマニュアルを参照してください。

第二の方法は、あなたが他の

after_destroy do |record| 
    other = Relationship.find_by_user_id_and_peer_id(record.peer_id, record.user_id) 
    other.destroy if other 
end 

行うafter_destroyコールバックである - ここで、両側のそれはブール受け入れられたフィールドを持つようにし、おそらくより抜本的な対策は、モデルを手直しすることを関係はデータベースの1つのレコードによってモデル化され、レコードには制約があります。(peer_id, user_id) = (user_id, peer_id)です。そうすれば、両面の削除や重複したレコードの心配がなくなります。

関連する問題