Day 29 Rails soft delete - paranoia

记得当初上课时第一次听到软删除这个词蛮震惊的,没想到网路世界是这麽可怕的阿。

阿修说文解字

soft delete vs hard delete

网路上的删除有分两种,软删除以及硬删除:

  • 软删除:当使用者案下删除键後,後台只是用某种方式让使用者看不到资讯而已,但其实资料还是存在於资料库内,像有些通讯软件的收回可能就是软删除。
    • 好处:後台帮使用者把资料都存的好好的,使用者的资料还救得回来。
    • 坏处:使用者在网路上做的任何事情都会被记录下来,所以没事不要乱上传东西到网路上阿,你不会知道该网站的後台是怎麽处理你的资料的。
  • 硬删除:当使用者案下删除键後,就真的从资料库删除资料了,想救也救不回来。

Rails 的 soft delete

在 Rails 内,当你使用 destroy 这个方法後就会直接从资料库删除档案,也就是硬删除。
假如想要使用软删除可以使用 paranoia 套件搭配 acts_as_paranoid。
现在我想把一个笔记的删除变成软删除,我可以这样做:

  1. 安装 paranoia 套件,接着 bundle install
  gem 'paranoia', '~> 2.4', '>= 2.4.3'           # 目前 2.4.3 为最新版
  1. 先用终端机建立一个 migration,deleted_at 这个名字可以随意取,主要是要让自己或别人看得懂这个 migration 是在做甚麽。
  rails g migration deleted_at
  1. 在 migration 档里面对 note model 新增 deleted_at 栏位,型态为 datetime,会使用 deleted_at 跟 datetime 是因为 paranoia 这个套件的惯例就是这样,所以我们要照着设定。
class DeletedAt < ActiveRecord::Migration[6.1]
  def change
    add_column :notes, :deleted_at, :datetime  # 新增栏位: 资料表名称,栏位名称,型态
    add_index :notes, :deleted_at              # 新增索引: 加快查询,概念有点像写书会加的附录
  end
end

4.1 在 note model 新增 default_scope 让所有的笔记都先预设为显示 deleted_at 栏位里面值是 nil 的笔记。

  default_scope { where(deleted_at: nil) }

4.2 或是直接在 note model 输入 acts_as_paranoid 也可以完成上述的行为。

  acts_as_paranoid
  1. 在 note controller 把 @note.destroy 改成 @note.update(deleted_at: Time.now),从原本的删除笔记变成更新笔记的状态,因为刚刚预设是 nil 可以看的到,点下去後会变成现在的时间,也就是有值的状态,就会变成看不到此篇笔记。
def destroy
  @note.update(deleted_at: Time.now)
end

=> 如此一来以後使用 destroy 方法删除档案时就会变成软删除了。

Rails 的 hard delete

那假如我想用硬删除该怎麽办呢?
paranoia 帮你新增了一个方法叫 really_destroy!
使用他就可以变成硬删除了。

参考:
[1]paranoia套件


<<:  Day 29 - 计算均线资料

>>:  day29 大量操作怎麽办? 连volatile都救不了我QQ

Debian 执行alien转换rpm报错解决

在debian下使用alien转换MegaRAID Storage Manager的RPM到deb过...

Day14 vue.js注册验证帐号是否重复ep2

延续昨天 今天的目标是把注册功能完善! 这是昨天的console.log 来试试看 把id(帐号)设...

33岁转职者的前端笔记-DAY 20 Javascript 基本知识笔记

写Javascript前必要小知识 1.<!DOCTYPE html> 为 HTML 5...

(ISC)² 道德准则

(ISC)² 道德准则仅适用於 (ISC)² 会员。垃圾邮件发送者的身份不明或匿名,这些垃圾邮件发送...

资料存取的先後顺序:Stack 和 Queue

题组回顾与观念统整 Stack 和 Queue 绝对是资料结构中不可以错过的一种容器,不只用於资料...