2013-05-02 148 views
0

我有一個user_relations表。雙向刪除關係

user_id | related_user_id 
------------------------- 
    1  | 15 
    1  | 17 
    4  | 56 
15  | 1 
    5  | 34 

當我銷燬該行(1 | 15),我想導軌自動刪除平行排(15 | 1)

有沒有這樣做的軌道方式?

這是user_relation類:

class UserRelation < ActiveRecord::Base 
    belongs_to :user, :class_name => "User", :foreign_key => "user_id" 
    belongs_to :related_user, :class_name => "User", :foreign_key => "related_user_id" 
end 
+1

是'user_relations'連接表嗎? – shweta 2013-05-02 11:10:47

+0

我不確定你的意思是「加入」。它正在加入與user_id和related_user_id列相同的用戶表。 – 2013-05-02 11:14:43

+1

你有任何代表user_relations的模型嗎?或者它只是一個數據庫表? – 2013-05-02 11:17:08

回答

3

是的,你可以寫一個過濾器UserRelation模型這樣做,

after_destroy :delete_associated 


def delete_associated 
ur = UserRelations.find_by_related_user_id_and_user_id(related_user_id, user_id) 
ur.delete if ur 
end 

更新:

要創建相關記錄,您可以編寫一個像這樣的過濾器,

after_create :create_associated 
def create_associated 
    UserRelations.find_or_create_by_related_user_id_and_user_id(related_user_id, user_id) #check if already exist or create new 
end 
+0

它不工作!它產生了一個無限循環!因爲每次它嘗試刪除它再次來到這個回調... – 2013-05-02 12:14:20

+2

這是正確的,你可以使用刪除而不是銷燬,以避免回調。更新了上面的答案。 – 2013-05-02 12:19:08

+0

有沒有辦法用after_save來做到這一點?我的意思是在after_save回調中保存一個新的同一對象,而不必再次進行after_save回調。 – 2013-05-02 12:22:33

0

我想你可以選擇帶這兩個行:

result = UserRelation.where(:user_id => [1,15]).where(:related_user_id => [1,15]) 

然後:

result.destroy_all 
1

如果有這樣的事

has_many: related_users, foreign_key: related_user_id

您可以添加dependent: destroy當此行被刪除它也將破壞用戶

+0

我不想刪除用戶,只是在此表中創建的連接! – 2013-05-02 11:27:41