【发布时间】:2016-07-06 12:41:21
【问题描述】:
我有三个模型:
用户:
class User < ActiveRecord::Base
has_many :posts, :dependent => :destroy
scope :active, -> { where(deleted: false) }
end
发帖:
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments, :dependent => :destroy
scope :active, -> { where(deleted: false) }
end
评论:
class Comment < ActiveRecord::Base
belongs_to :post
scope :active, -> { where(deleted: false) }
end
现在,我正在对 User 进行软删除,并且我在所有三个表中都有名为 deleted 的列(User, Post, Comment)
用户销毁方法:
def destroy
@user = user.find(params[:id])
if @user.update_attributes(deleted: true)
@user.posts.each do |post|
post.comments.update_all(deleted: true)
end
@user.posts.update_all(deleted: true)
end
end
如果没有,上述实现需要更多时间。帖子和 cmets 的数量很高,它还会产生 N+1 查询问题..
同上我已经为Post实现了destroy方法,我不知道如何高效..
我不想使用任何宝石。
请告诉我一种更好的方法来对这些关联进行软删除..
【问题讨论】:
-
你真的需要删除帖子吗?您可以通过在检索它们时包含用户模型来替代它们。确实没有必要将所有后代标记为已删除。
-
更好的方法是为此使用 gem:Paranoia (github.com/rubysherpas/paranoia) 或 ActsAsParanoid (github.com/ActsAsParanoid/acts_as_paranoid)。
-
@gen 发帖人说他不想使用 gem。
-
@Matt:是的,但我仍然建议使用 gem。 :) 代码和维护越少越好。