2011-01-06 56 views
1

在我的項目中,我有一個自我指涉的關聯。破壞自我指涉關聯的雙方的最佳方式是什麼?

我有一個用戶模式:

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

有關係模型:

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

當兩個用戶是彼此的同行,也有明顯的兩個記錄在數據庫中。

當一個用戶選擇結束關係時,我想要銷燬這兩個記錄 - 而不僅僅是關係的一方。

有沒有更好的方式去做這件事,而不是在控制器中加載兩次關係(每次關係一次)?

回答

1

幾種方法可以做到這一點

首先是一個刪除觸發後,這是如果你相信數據庫不可知論的虛假承諾做事情的一個非常有爭議的方式,不過是一個工程 - 本質上,你看看old.peer_id和old.user_id,然後做一個刪除操作,但是會顛倒角色。如果你想要走這條路線,你應該查閱數據庫手冊,瞭解如何實現觸發器。

第二種方式是after_destroy回調,你做一個

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

其他 - 也許更嚴厲的措施是返工的模式,所以它有一個布爾接受字段,其中兩側該關係是通過數據庫中的一條記錄建模的,對記錄有一個約束,其中(peer_id, user_id) = (user_id, peer_id)。這樣你就不必擔心刪除雙方,也沒有重複的記錄。

相關問題