Module: Stipa::Model::SoftDelete
- Defined in:
- lib/stipa/model/soft_delete.rb
Overview
Soft delete support for Sequel models.
Provides soft_delete, restore, and deleted? instance methods,
plus deleted and not_deleted dataset scopes.
Your table must have a nullable deleted_at timestamp column.
# db/migrate/001_create_posts.rb
create_table :posts do
primary_key :id
DateTime :deleted_at
# ...
end
Opt into the default scope
By default, soft-deleted rows are NOT filtered from queries.
To exclude them automatically, override dataset in your model:
class Post < ApplicationModel
def self.dataset
super.not_deleted
end
end
Post.where(title: "foo") # => WHERE (deleted_at IS NULL) AND (title = 'foo')
Without the override, include records as usual:
Post.where(title: "foo") # => WHERE (title = 'foo')
Class Method Summary collapse
Instance Method Summary collapse
-
#deleted? ⇒ Boolean
Returns
trueif the record has been soft-deleted. -
#restore ⇒ Object
Restore a soft-deleted record.
-
#soft_delete ⇒ Object
Mark the record as soft-deleted.
Class Method Details
.included(base) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/stipa/model/soft_delete.rb', line 34 def self.included(base) base.instance_eval do dataset_module do def deleted where(deleted_at: !nil) end def not_deleted where(deleted_at: nil) end end end end |
Instance Method Details
#deleted? ⇒ Boolean
Returns true if the record has been soft-deleted.
64 65 66 |
# File 'lib/stipa/model/soft_delete.rb', line 64 def deleted? !deleted_at.nil? end |
#restore ⇒ Object
Restore a soft-deleted record.
post.restore # sets deleted_at = nil
59 60 61 |
# File 'lib/stipa/model/soft_delete.rb', line 59 def restore update(deleted_at: nil) end |
#soft_delete ⇒ Object
Mark the record as soft-deleted.
post.soft_delete # sets deleted_at = now
post.soft_delete # no-op (already deleted)
52 53 54 |
# File 'lib/stipa/model/soft_delete.rb', line 52 def soft_delete update(deleted_at: Time.now.utc) end |