【问题标题】:What's an efficient way to delete threaded comments from database in active record?从活动记录中的数据库中删除线程评论的有效方法是什么?
【发布时间】:2019-11-19 19:32:23
【问题描述】:
在我们的应用中,我们有用户帖子和用户帖子上的 cmets。用户也可以评论 cmets,所以它有点像 Reddit Post 模型。由于产品要求,当用户删除他们的帖子时,所有的 cmets,包括评论回复也必须被删除。我们遇到了评论线程数可能达到数千的情况。我想知道在 Rails/Active Record 中处理这个问题的最佳方法是什么?我正在考虑像深度优先搜索和批量删除 cmets 一样。我看到了一些可用于将 db 记录映射到树状结构的 gem,但它们都需要添加一个我想避免的 db 列。有没有人有什么建议?我们正在使用 Postgres 10 和 rails 5
【问题讨论】:
标签:
ruby-on-rails
postgresql
activerecord
tree
【解决方案1】:
也许尝试在 ActiveJob 中执行此操作并在后台执行 cmets 删除。
【解决方案2】:
ActiveRecord 有after_destroy 回调,与后台工作人员一起使用会很有用。
另外,不建议使用:dependent => :destroy,在你的情况下它是错误的。
after_destroy :delete_comments
private
def delete_comments
BlablaDeleteCommentsJob.perform_later(self.id)
end
# worker | job
class BlablaDeleteCommentsJob < ApplicationJob
def perform(blog_id)
puts "*"*50
puts "Performing from |BlablaDeleteComments Job| "
puts "*"*50
# batch delete comments here
Comment.where(blog_id: blog_id).delete_all
end
end