软删除

作者: ibob2012 | 来源:发表于2019-08-24 15:51 被阅读0次

软删除即不真正删除数据库中的数据,数据是可以恢复的,只是对用户来讲是不可见的。软删除在实际应用中很广泛,除了一般的论坛应用,在微博和微信之类的应用中也随处可见。为什么要有软删除而不是直接删除呢?个人认为主要有两个方面的原因:一是数据本身就是有价值或有潜在价值的东西,二是和数据本身关联的其他数据有很多,比如文章的评论,如果直接删除了文章,那么评论也会随之被删除,某些用户可能并不希望这样。因此,软删除可以很好的解决这个问题。

我想在应用中实现软删除也主要是因为文章和评论不宜直接从数据库中删除,如果一篇文章被作者删除,应用需要告诉收藏这篇文章的用户和评论这篇文章的用户:这篇文章已经被作者删除了;当3楼的评论被作者删除,应用也需要告诉@3楼的其他用户:3楼的评论已经被作者删除。这可以提高用户的体验。

一开始,我对如何实现软删除是没有什么好的思路的,我也知道会有很多的 gem 包可以实现这个功能,但是我还是想手动实现软删除的功能。通过求助 stackoverflow,我得到了一些思路:

1) 为数据库添加一个新字段来表示记录是否被软删除 2) 使用 ActiveSupport::Concern

第一个思路很好理解,即在数据库表中添加一个新字段做标志位,如果需要软删除,则设置为1,否则设置为0,也可以填充其他内容。

#app/models/comment.rb

class    Comment...

       ‘’‘ field:deleted_at,type: DataTimedefault_scope->{where(deleted_at: nil)}...’‘’

def        soft_destroy

self.update_attributes(deleted_at: Time.now)

end..

.end

此处设置 deleted_at 为标志位,如果是软删除则设置 deleted_at 的时间为当前时间。设置默认的 scope 是为了在每次查询的时候过滤掉软删除的记录。soft_destroy 是用来取代 destroy 方法。这样一来就基本上实现了软删除的功能,看起来还是比较简单的,对吧😄

但是此处存在一个问题:除了 Comment model 需要添加软删除的功能,Article model 也需要,如果简单的拷贝代码到 。Article model 当中,那就违反了 Rails DRY 原则。我们需要把软删除的功能封装成一个 module,可以让不同的 model 有选择性的调用,此处就要用到ActiveSupport::Concern。

ActiveSupport::Concern

在 models 的 concerns 目录新添加一个文件 soft_delete.rb,将软删除的功能封装到其中的 SoftDelete module 当中。

#app/models/concerns/soft_delete.rbmoduleSoftDeleteextendActiveSupport::Concernincludeddofield:deleted_at,type: DateTimedefault_scope->{where(deleted_at: nil)}defsoft_destroyself.update_attributes(deleted_at: Time.now)endendend

在 Comment model中引用 SoftDelete module:

#app/models/comment.rbclassCommentincludeMongoid::DocumentincludeSoftDelete...end

将 comments_controller.rb 中的 destroy 方法替换为 soft_destroy 方法:

#app/controllers/comments_controller.rb

def    destroy

        @comment.soft_destroy...

end

修改对应的视图文件,根据 deleted_at 字段判断评论是否被删除:

#app/views/comments/_show_html.erb

<%@article.comments.unscoped.each_with_indexdo|comment,index|%>

<ulclass="list-group"><liclass="list-group-item">

<%ifcomment.deleted_at%>

<h6class="text-center">抱歉,此条评论已被作者删除</h6>

<%else%>..

.<divclass="media-body">

<h6class="media-heading">

<%=link_tocomment.name,user_path(User.find_by(user_name: comment.name))%>/

<%="#{comment.floor}楼"%>

<%ifUser.find_by(user_name: comment.name)==current_user%>

<%=link_to'编辑',edit_article_comment_path(comment.article,comment)%>

<%=link_to'删除',[comment.article,comment],method: :delete%>

<%end%>

</h6><%=markdown(comment.content)%></div>...</div>

原文地址:https://liuxingqi.com/ruby/rails/rails-app-study-14/

相关文章

  • 软删除

    软删除即不真正删除数据库中的数据,数据是可以恢复的,只是对用户来讲是不可见的。软删除在实际应用中很广泛,除了一般的...

  • linux创建软链接

    Ubuntu创建软连接 建立软连接 删除软连接 创建软连接

  • 数据的软删除—什么时候需要?如何去实现?

    阅读完本文你将会学会 什么是软删除? 如何考量是否使用软删除 如何在Spring里实现软删除 1. 前言 我们在开...

  • 妥善处理复杂业务系统中的“删除”

    删除的分类 什么是软删除软删除又叫逻辑删除,标记删除,与我们常说的删除不同,并不是真的从数据库中将这条记录去除,而...

  • Laravel软删除

    1.首先要做一些设置首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,...

  • xorm - 软删除

    在xorm标记中使用deleted标记,且对应的字段必须为time.Time类型。 packagemainimpo...

  • linux软链接的创建、删除和更新

    1. 创建软链接 例如: 创建~/Desktop/test 引向~/test文件夹 2. 删除软链接 和删除普通的...

  • Laravel设置软删除及其恢复系列操作

    软删除及其相关实现 在模型类中要使用SoftDeletestrait并设置$date属性数组 数据迁移中软删除字段...

  • Linux关于软连接相关操作

    建立软链接 ln -s 当前文件 软链接名 删除软链接 rm -rf 软链接名 (注意不带 “/”) 解决sed...

  • Laravel6.X软删除教程

    软删除的意思就是没有真正删除,只是在数据库里标记了一下,便于随时恢复。我们可以软删除用户,让他失去正常的权限,也可...

网友评论

      本文标题:软删除

      本文链接:https://www.haomeiwen.com/subject/grrqectx.html