Sha256: 221ec672aa89c07906e734cda05c8b2f80dd7dc41867e0ffd0d278ffc3df2226

Contents?: true

Size: 1.21 KB

Versions: 2

Compression:

Stored size: 1.21 KB

Contents

module Ohm
  # Provides support for soft deletion
  #
  # @example
  #
  #   class Post < Ohm::Model
  #     plugin :softdelete
  #
  #     attribute :title
  #     index :title
  #   end
  #
  #   post = Post.create(:title => 'Title')
  #
  #   post.deleted?
  #   # => false
  #
  #   post.delete
  #
  #   post.deleted?
  #   # => true
  #
  #   Post.all.empty?
  #   # => true
  #
  #   Post.find(:title => 'Title').include?(post)
  #   # => true
  #
  #   Post.exists?(post.id)
  #   # => true
  #
  #   post = Post[post.id]
  #
  #   post.deleted?
  #   # => true
  module SoftDelete
    DELETED_FLAG = "1"

    def self.included(model)
      model.attribute :deleted

      model.extend ClassMethods
    end

    def delete
      self.class.all.delete(self)
      self.class.deleted.add(self)

      update(deleted: DELETED_FLAG)
    end

    def restore
      self.class.all.add(self)
      self.class.deleted.delete(self)

      update(deleted: nil)
    end

    def deleted?
      deleted == DELETED_FLAG
    end

    module ClassMethods
      def deleted
        Model::Set.new(key[:deleted], Model::Wrapper.wrap(self))
      end

      def exists?(id)
        super || key[:deleted].sismember(id)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ohm-contrib-1.0.rc1 lib/ohm/softdelete.rb
ohm-contrib-1.0.rc0 lib/ohm/softdelete.rb