我有一种方法可以找到子女评论的父帖。假设有这样的帖子和评论布局:
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
添加到评论中,但很好奇是否还有其他方法可以解决此问题。
我会给您一个快速的答案,不,没有办法更改查找已删除项目的方法,因为一旦您删除了它,就会失去该关系。p>您想到的几种解决方案是您建议使用post_id的建议,它可以满足您的需求(如果我从以前的问题中记住了,您目前只允许评论两个级别),但是,如果要更改,将来,您想允许进一步的评论,这种方法无法很好地发挥作用,因为您会跳过很多祖先的评论,直接转到上帖,可能会破坏评论结构。
如果您想将来证明这种情况,我会提出的一个建议是使用您已经拥有的多态性关系,当删除评论时,将所有孩子都指向其父母,并使用单独的专栏具有has_deleted_parent
或可以表明原始注释结构的突破,并使保护视图中的结构变得更加容易。
但是,这种方法也存在一些问题,例如,如果删除的评论然后被删除了,那么布尔值就不够,需要计数器,但是事情开始变得更加复杂。
另一种方法是重新考虑UX,因此一旦删除了所有孩子的评论,就会被删除?或我想要的一种方法是不允许删除注释,而是允许浅表删除评论的评论在其中仍然存在,因此可以保护您的数据,而是作为空外壳,并且在视图中,只需沿" )的一些文字删除
不是我知道的直接答案,但我希望这也许是帮助!