我有一种方法可以找到子评论的父帖子。假设有一个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
,但是如果有其他方法可以解决这个问题,那我很好奇。
答案 0 :(得分:1)
我会给你一个快速回答,没有办法改变查找已删除项目父项的方法,因为一旦你删除了它,你就失去了这种关系。
我想到的几个解决方案就是你建议使用post_id,它可以很好地满足你的需求(如果我从你之前的问题中正确记得你目前只允许两个级别的评论),但是如果要改变的话在将来你想要允许更多级别的评论,这种方法不会很好,因为你会跳过很多祖先的评论并直接进入上面的帖子,可能会破坏评论结构。
如果您希望将来证明这个案例,我建议的一个建议是使用您已有的多态关系,并在删除注释时,将所有子项指向其父项,并使用单独的列,如有has_deleted_parent
或者其他东西来表示原始注释结构中断,并且更容易保护视图中的结构。
但是这种方法也存在一些问题,例如如果删除的注释parent然后被删除,那么布尔值就不够了,并且需要一个计数器,但事情开始变得更复杂。
另一种方法是重新考虑用户体验,所以一旦删除了注释,其所有子项都会被删除?或者我更喜欢的方法是不允许删除注释,而是允许表达删除注释,实际模型仍然存在,从而保护您的数据,但只是作为一个空壳,并且在视图中只是一些文字“此评论已被删除”
我知道这不是一个直接的答案,但我希望它可能是一个帮助!