2016-07-06 50 views
1

删除我有三个型号:软与各协会

用户:

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 

评论:

012现在

,我做软删除User,我已经列命名为所有三个表(User, Post, Comment

用户销毁方法deleted

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,我不知道如何有效地做到这一点..

我不不想使用任何宝石。

请告诉我一个更好的方式做软删除这些类型的社团..

+0

你真的需要删除帖子吗?您可以通过在检索时包含用户模型来扩大范围。将所有后代标记为已删除确实没有必要。 – Matt

+0

更好的方法是使用宝石:Paranoia(https://github.com/rubysherpas/paranoia)或ActsAsParanoid(https://github.com/ActsAsParanoid/acts_as_paranoid)。 – 2016-07-06 12:51:41

+2

@gen海报表示他不想使用宝石。 – Matt

回答

1

你真的需要删除的帖子?您可以通过在检索时包含用户模型来扩大范围。将所有后代标记为已删除确实没有必要,因为它可以很容易地从父项推断出来。

用户:

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 
1

如果它是所有关于效率(除去N + 1),我会做的下方。我还为“胖模型和瘦控制器”的东西,所以我会从控制器移到你的逻辑用户模式:

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不会触发更新实体上的任何验证或回调。

+0

感谢您的回答.. –