Sha256: c03a1e56c47c8c830d3d4346349d61d1576298acc7899b069a3f943817435957

Contents?: true

Size: 1.52 KB

Versions: 4

Compression:

Stored size: 1.52 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
      redis.queue("MULTI")
      redis.queue("SREM", model.all.key, id)
      redis.queue("SADD", model.deleted.key, id)
      redis.queue("HSET", key, :deleted, DELETED_FLAG)
      redis.queue("EXEC")
      redis.commit

      self.deleted = DELETED_FLAG

      return self
    end

    def restore
      redis.queue("MULTI")
      redis.queue("SADD", model.all.key, id)
      redis.queue("SREM", model.deleted.key, id)
      redis.queue("HDEL", key, :deleted)
      redis.queue("EXEC")
      redis.commit

      self.deleted = nil

      return self
    end

    def deleted?
      deleted == DELETED_FLAG
    end

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

      def exists?(id)
        super || redis.call("SISMEMBER", key[:deleted], id) == 1
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ohm-contrib-2.0.0.alpha5 lib/ohm/softdelete.rb
ohm-contrib-2.0.0.alpha4 lib/ohm/softdelete.rb
ohm-contrib-2.0.0.alpha3 lib/ohm/softdelete.rb
ohm-contrib-2.0.0.alpha2 lib/ohm/softdelete.rb