如果删除父评论(对评论的评论),则设计用于查找评论的父帖子的方法将中断

时间:2016-11-26 01:21:06

标签: ruby-on-rails ruby

我有一种方法可以找到子评论的父帖子。假设有一个Post和Comment布局,如下所示:

Post
    Comment
        Child comment # Find parent post all the way up tree
        Child comment
    Comment

我的用户模型中有一个方法来获取用户的注释,并将它们与父帖一起放在哈希中,如下所示:

# user.rb
def comment_post_hash
  @comment_hash = []
  @user_comments = Comment.where(user_id: self.id)
  @user_comments.all.each do |co|
     post = co.find_parent_post # Another method defined below
    @comment_hash.push( { comment: co, post: post} )
  end
  @comment_hash
end

 # comment.rb
 def find_parent_post
   return self.commentable if self.commentable.is_a?(Post)
   self.commentable.find_parent_post
 end

问题是,如果在链中的某处删除了父注释,则此方法将会中断,如下所示:

Post
    <deleted> # No longer exists
        Child comment # This will break the method.
        Child comment
    Comment

有没有办法重构这个方法,以便它可能被救出并且能够找到父帖子,无论父评论是否被删除?我只能考虑在评论中添加一个post_id,但是如果有其他方法可以解决这个问题,那我很好奇。

1 个答案:

答案 0 :(得分:1)

我会给你一个快速回答,没有办法改变查找已删除项目父项的方法,因为一旦你删除了它,你就失去了这种关系。

我想到的几个解决方案就是你建议使用post_id,它可以很好地满足你的需求(如果我从你之前的问题中正确记得你目前只允许两个级别的评论),但是如果要改变的话在将来你想要允许更多级别的评论,这种方法不会很好,因为你会跳过很多祖先的评论并直接进入上面的帖子,可能会破坏评论结构。

如果您希望将来证明这个案例,我建议的一个建议是使用您已有的多态关系,并在删除注释时,将所有子项指向其父项,并使用单独的列,如有has_deleted_parent或者其他东西来表示原始注释结构中断,并且更容易保护视图中的结构。

但是这种方法也存在一些问题,例如如果删除的注释parent然后被删除,那么布尔值就不够了,并且需要一个计数器,但事情开始变得更复杂。

另一种方法是重新考虑用户体验,所以一旦删除了注释,其所有子项都会被删除?或者我更喜欢的方法是不允许删除注释,而是允许表达删除注释,实际模型仍然存在,从而保护您的数据,但只是作为一个空壳,并且在视图中只是一些文字“此评论已被删除

我知道这不是一个直接的答案,但我希望它可能是一个帮助!