Sha256: 8d053e58a21276a606dbe6005715481ac65530aed2dc1fc7537797be698fd7b5

Contents?: true

Size: 1.99 KB

Versions: 2

Compression:

Stored size: 1.99 KB

Contents

require 'active_support/concern'

module Ardm
  class Property
    module ParanoidBase
      extend ActiveSupport::Concern

      included do
        extend ClassMethods
        instance_variable_set(:@paranoid_properties, {})
        instance_variable_set(:@paranoid_scopes, [])
      end

      def paranoid_destroy
        self.class.paranoid_properties.each do |name, block|
          attribute_set(name, block.call(self))
        end
        save
        @readonly = true
        true
      end

      def destroy(execute_hooks = true)
        # NOTE: changed behavior because AR doesn't call hooks on destroying new objects
        return false if new_record?
        if execute_hooks
          run_callbacks :destroy do
            paranoid_destroy
          end
        else
          super
        end
      end

      module ClassMethods
        def inherited(model)
          model.instance_variable_set(:@paranoid_properties, @paranoid_properties.dup)
          model.instance_variable_set(:@paranoid_scopes, @paranoid_scopes.dup)
          super
        end

        # @api public
        def with_deleted(&block)
          with_deleted_scope = self.scoped.with_default_scope
          paranoid_scopes.each do |cond|
            with_deleted_scope.where_values.delete(cond)
          end

          if block_given?
            with_deleted_scope.scoping(&block)
          else
            with_deleted_scope.all
          end
        end

        # @api private
        def paranoid_properties
          @paranoid_properties
        end

        def paranoid_scopes
          @paranoid_scopes
        end

        # @api private
        def set_paranoid_property(name, &block)
          paranoid_properties[name] = block
        end

        def set_paranoid_scope(conditions)
          paranoid_scope = conditions
          paranoid_scopes << paranoid_scope
          default_scope { where(paranoid_scope) }
        end
      end # module ClassMethods
    end # module ParanoidBase
  end # class Property
end # module Ardm

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ardm-0.1.0 lib/ardm/property/support/paranoid_base.rb
ardm-0.0.1 lib/ardm/property/support/paranoid_base.rb