我有三种模式:
用户:
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] 删除。
我来说两句