2011-06-28 56 views
2

所以我有一個友誼表看起來像這樣兩行表:依賴=>:摧毀它包含「相同的結果」

create_table "friendships", :force => true do |t| 
    t.integer "user_id" 
    t.integer "friend_id" 
    t.integer "status" 
    end 

對於各好友創建了兩個行插入,與USER_ID和friend_id恢復。當用戶被刪除時,友誼也應該被刪除。此代碼刪除其中之一:

has_many :friendships, :dependent => :destroy 

但是,這隻會刪除其中一個友誼。在我的友誼模式,我有這樣的代碼:

belongs_to :user 
    belongs_to :friend, :class_name => "User", :foreign_key => "friend_id" 

我也有去除它創建調用破壞雙方的關聯對象事務友誼的自定義方法。

我的解決方案是重寫User中的destroy方法,並遍歷所有友情並調用我的remove方法。這有效,但它是一個優雅的解決方案?我覺得可以有一個很好的Rails方式來做到這一點。

謝謝。

+0

請推薦一個更好的標題。我確定這被稱爲某種東西。 :) –

回答

0

最優雅的解決方案是在用戶模型上有兩個has_many關係,一個用於'此用戶的朋友'(您已擁有),另一個用於'將此用戶稱爲朋友的用戶'。然後設置他們兩個:dependent => :destroy

def User 
    # Friends of this user 
    has_many :friendships, :dependent => :destroy 
    has_many :friends, :through => :friendships 

    # Users who call this user a friend 
    has_many :friendships_of, :class_name => "Friendship", :foreign_key => "friend_id", :dependent => :destroy 
    has_many :friends_of, :through => :friendships_of 
end 

這將意味着毀滅用戶還刪除引用該用戶爲無論是USER_ID或friend_id任何友誼的記錄。

雖然在破壞友誼記錄時刪除兩個關聯的對象似乎是一個糟糕的主意 - 破壞友誼通常並不意味着兩個朋友都不復存在!

+0

用戶不應該被銷燬。一個友誼由數據庫中的兩行組成。 –

+0

幾乎沒有發現你確實得到了答案,謝謝! –

+1

啊 - 那麼你想摧毀一半的友誼(我稱你爲朋友)以自動消滅另一半(你稱我爲朋友)?在這種情況下,您可以在友情模型上使用before_destroy回調方法來實現該方法。 –