首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软删除与关联

软删除与关联
EN

Stack Overflow用户
提问于 2016-07-06 12:41:21
回答 2查看 3K关注 0票数 1

我有三个模特:

用户:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  scope :active, -> { where(deleted: false) }
end

邮报:

代码语言:javascript
复制
class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments, :dependent => :destroy

  scope :active, -> { where(deleted: false) }
end

评论:

代码语言:javascript
复制
class Comment < ActiveRecord::Base
  belongs_to :post
  scope :active, -> { where(deleted: false) }
end

现在,我正在对User进行软删除,在所有三个表(User, Post, Comment)中都有名为deleted的列。

用户破坏方法:

代码语言:javascript
复制
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方法,我不知道如何有效地实现它。

我不想用任何宝石。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-06 12:50:59

你真的需要删除这些帖子吗?您可以通过在检索它们时包含用户模型来筛选它们。将所有后代标记为已删除并不是必要的,因为从父级可以很容易地推断出来。

用户:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  scope :active, -> { where(deleted: false) }
end

员额:

代码语言:javascript
复制
class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments, :dependent => :destroy

  scope :active, -> { joins(:user).merge(User.active) }
end
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 13:12:11

如果这一切都是关于效率(删除N+1),我会做以下工作。我也支持“胖模型和瘦控制器”,所以我会将您的逻辑从控制器转移到用户模型:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  has_many :comments, through: :posts

  scope :active, -> { where(deleted: false) }

  after_save :delete_posts_and_comments, if: :delete_posts?

  private

    def delete_posts?
      deleted_changed? && deleted
    end

    def delete_posts_and_comments
      posts.update_all(deleted: true)
      comments.update_all(deleted: true)
    end
end

当然,您也可以使用相同的模式来撤消删除。

注意!update_all不触发更新实体的任何验证或回调。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38224279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档