0

我有兩個模型其中之一是用戶和另一個評論。評論屬於用戶。維護與act_as_paranoid的關聯

class User < ActiveRecord::Base 
    act_as_paranoid 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
end 

當我做user.delete在我的控制,我得到了deleted_at列被設置和記錄被隱藏的預期效果。

我的問題是用戶的評論關聯設置爲空。所以現在在網站上顯示沒有用戶擁有評論。我想評論仍然顯示用戶的名稱不是「無」或「匿名」等。

看着github上的源代碼https://github.com/goncalossilva/rails3_acts_as_paranoid/blob/rails3.2/lib/acts_as_paranoid/core.rb它似乎調用run_callbacks,這反過來導致Rails 3回落到Nullify關聯的默認值。

就我而言,我只是希望用戶帳戶在被刪除時關閉。不再顯示在查詢中,Authlogic將拒絕它們,並且用戶索引頁面不會顯示它們。但仍然允許用戶擁有的所有東西仍歸他們所有(因爲他們可能會回來等等)。

有沒有更好的辦法做到這一點,然後acts_as_paranoid?

回答

0

而不是重寫destroy方法的麻煩我創建了一個簡單的方法,只是將closed_at設置爲時間戳。如果設置默認範圍是這樣的:

default_scope { where("closed_at IS NULL") } 

那麼模型將不會出現任何疑問,包括User.All。你可以刪除範圍來獲得完整的查詢,基本上我從act_as_paranoid中獲得了這些想法,但更加簡化。問題是,即使評論仍設置了user_id,默認作用域將以任何關聯加載運行。所以說

c = Comment.first 
c.user 

如果user_id是一個封閉的帳戶,那麼將輸出nil。在我的情況下最容易solusion是刪除默認作用域和修改我的Authlogic功能:

def self.find_by_username_or_email(login) 
    u = User.find(:first, :conditions => ["lower(username) = ?", login.downcase]) || User.find_by_email(login) 
    return u unless u.closed_at 
end 

這樣關閉帳戶不能登錄。無論我在視圖中列出用戶,我都使用了hide_closed範圍。

不知道這是否是最好的最優雅的解決方案。但爲了我的目的,它是有效的。