关联软删除

古库尔

我有三种模式:

用户:

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

否时,以上实现需要更多时间。帖子和评论的数量很高,而且还会产生N + 1个查询问题。

与上述destroy方法一样,我已经实现了方法Post,但我不知道该如何有效地执行。

我不想使用任何宝石。

请告诉我一种更好的方法来对这些类型的关联进行软删除。

马特

您真的需要删除帖子吗?您可以通过在检索它们时包括用户模型来将它们限定在范围之外。如果可以很容易地从父级推断出所有后代,则实际上没有必要将其标记为已删除。

用户:

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, -> { joins(:user).merge(User.active) }
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章