软删除

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

我想在应用中实现软删除也主要是因为文章和评论不宜直接从数据库中删除,如果一篇文章被作者删除,应用需要告诉收藏这篇文章的用户和评论这篇文章的用户:这篇文章已经被作者删除了;当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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 一般情况下我都会使用 MySQL 的外键约束来删除管理的记录。在 Laravel 中这很容易做到,你只需要在 Mi...
    GQ1994阅读 4,575评论 0 4
  • 硬删除不多解释 为什么要用到软删除 有后悔药可以恢复数据。但是同时带来弊端。导致 查数据时 慢 尤其是一些特殊场景...
    数据小菜鸟阅读 15,975评论 0 0
  • 1.首先要做一些设置首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,...
    Feng_Yikai阅读 4,230评论 0 0
  • 在xorm标记中使用deleted标记,且对应的字段必须为time.Time类型。 packagemainimpo...
    Uzero阅读 1,575评论 0 0
  • (昨天本想写第二篇“狂想曲”的,开了个头就狂不下去了,改成了一篇随笔。最近在反刍回味雪师的《西夏咒》,特别是里面“...
    安成_Anson阅读 222评论 0 8