Sha256: a7cd79dae9e1ebce341cc438651ebb0e4b20c1fbc777fcf1f99897d8f69b41b8

Contents?: true

Size: 1.23 KB

Versions: 8

Compression:

Stored size: 1.23 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
      db.multi do
        model.all.key.srem(id)
        model.deleted.key.sadd(id)
        set :deleted, DELETED_FLAG
      end
    end

    def restore
      db.multi do
        model.all.key.sadd(id)
        model.deleted.key.srem(id)
        set :deleted, nil
      end
    end

    def deleted?
      deleted == DELETED_FLAG
    end

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

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

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
ohm-contrib-1.2 lib/ohm/softdelete.rb
ohm-contrib-1.1.0 lib/ohm/softdelete.rb
ohm-contrib-1.0.1 lib/ohm/softdelete.rb
ohm-contrib-1.0.0 lib/ohm/softdelete.rb
ohm-contrib-1.0.0.rc5 lib/ohm/softdelete.rb
ohm-contrib-1.0.0.rc4 lib/ohm/softdelete.rb
ohm-contrib-1.0.0.rc3 lib/ohm/softdelete.rb
ohm-contrib-1.0.0.rc2 lib/ohm/softdelete.rb