2016-02-05 41 views
0

當我嘗試訪問包含已在數據庫中刪除的用戶評論的帖子時,出現錯誤undefined method 'email' for nil:NilClass如果用戶不存在,請刪除評論Ruby on Rails

我想知道:我該如何刪除那些不再存在的用戶創建的評論?

我想是這樣的

<%= div_for(comment) do %> 
    <% if comment.user.email.nil?%> 
     <% comment.destroy %> 
    <%else%> 
     <p><%= comment.body %></p> 
     <p class="comment-submitted-by"><%= time_ago_in_words(comment.created_at) %> ago by 
     <%= comment.user.email %></p> 
    <%end%> 

,但我仍然得到錯誤。

回答

1

由於您引用了comment.user.emailusernil,所以仍然出現錯誤。你需要檢查comment.user.nil?,或者你也有風險刪除評論,只是因爲用戶的電子郵件丟失(儘管也許你禁止的是):

<% if comment.user.nil? %> 
    <% comment.destroy %> 

上飛清理打算挑剔和繁瑣。 User#comments關聯關係看起來像是dependent: :destroy

class User 
    has_many :comments, dependent: :destroy 
end 

那麼當你User被刪除,所有的Comment S的將是太強了,你沒有在顯示時間去擔心它。

由於存在現有孤兒的意見,你可以清理出來用一個簡單的SQL語句:

DELETE FROM comments WHERE user_id NOT IN (
    SELECT id FROM users 
) 

或者Rails的控制檯:

Comments.find_each { |c| c.destroy if c.user.nil? } 
+0

很好的答案,這解決了很多問題,我! 我有一個後續問題。在我的應用程序中,我有一個用戶模型,鏈接和評論。用戶has_many:鏈接,鏈接has_many:評論。 如果用戶評論了不是他的鏈接,然後他刪除了他的帳戶,該怎麼辦?那麼在我的情況下,他的鏈接就會消失,但看起來他的評論是否會保持。我應該在鏈接模型中添加什麼,以便該用戶對該鏈接的評論也被破壞? 對不起,如果我沒有任何意義。 – Flux

+0

如果用戶可以評論其他用戶的鏈接,我認爲'Comment'有'link_id,user_id',所以'User#has_many:comments,dependent :: destroy'應該清除他們的評論,而不會影響其他用戶的鏈接。還要刪除被銷燬的用戶鏈接:User#has_many:links,dependent :: destroy',並在鏈接被銷燬時清理註釋,鏈接#has_many:comments,dependent :: destroy'。基本上,將':dependent'添加到需要清理的任何關聯中。 –

+0

@Kristján'評論.find_each {| c | c.destroy如果c.user.nil?}'得到N + 1個查詢問題,應該是'Comment.joins('LEFT OUTER JOIN users on comments.user_id = users.id')。其中(users:{id:nil})。destroy_all' –

0

刪除從一個線程的一些意見可能使很難理解剩下的評論,因爲缺少背景。

因此,我想提出另一種方法:只要顯示已刪除的用戶而不是用戶的電子郵件時刪除用戶。

一個簡單的實現可能是這樣的:

<%= div_for(comment) do %> 
    <p><%= comment.body %></p> 
    <p class="comment-submitted-by"> 
    <%= time_ago_in_words(comment.created_at) %> ago by 
    <%= comment.user ? comment.user.email : 'deleted user' %> 
    </p> 
<%end%>