class ActiveRecord::Base

Public Class Methods

I_AM_THE_DESTROYER!() click to toggle source

Please do not use this method in production. Pretty please.

# File lib/paranoia.rb, line 233
  def self.I_AM_THE_DESTROYER!
    # TODO: actually implement spelling error fixes
    puts %Q{
      Sharon: "There should be a method called I_AM_THE_DESTROYER!"
      Ryan:   "What should this method do?"
      Sharon: "It should fix all the spelling errors on the page!"
}
  end
acts_as_paranoid(options={}) click to toggle source
# File lib/paranoia.rb, line 184
def self.acts_as_paranoid(options={})
  alias :really_destroyed? :destroyed?
  alias :really_delete :delete

  alias :destroy_without_paranoia :destroy
  def really_destroy!
    transaction do
      run_callbacks(:real_destroy) do
        dependent_reflections = self.class.reflections.select do |name, reflection|
          reflection.options[:dependent] == :destroy
        end
        if dependent_reflections.any?
          dependent_reflections.each do |name, reflection|
            association_data = self.send(name)
            # has_one association can return nil
            # .paranoid? will work for both instances and classes
            next unless association_data && association_data.paranoid?
            if reflection.collection?
              next association_data.with_deleted.each(&:really_destroy!)
            end
            association_data.really_destroy!
          end
        end
        write_attribute(paranoia_column, current_time_from_proper_timezone)
        destroy_without_paranoia
      end
    end
  end

  include Paranoia
  class_attribute :paranoia_column, :paranoia_sentinel_value

  self.paranoia_column = (options[:column] || :deleted_at).to_s
  self.paranoia_sentinel_value = options.fetch(:sentinel_value) { Paranoia.default_sentinel_value }
  def self.paranoia_scope
    where(paranoia_column => paranoia_sentinel_value)
  end
  default_scope { paranoia_scope }

  before_restore {
    self.class.notify_observers(:before_restore, self) if self.class.respond_to?(:notify_observers)
  }
  after_restore {
    self.class.notify_observers(:after_restore, self) if self.class.respond_to?(:notify_observers)
  }
end
paranoia_scope() click to toggle source
# File lib/paranoia.rb, line 218
def self.paranoia_scope
  where(paranoia_column => paranoia_sentinel_value)
end
paranoid?() click to toggle source
# File lib/paranoia.rb, line 242
def self.paranoid? ; false ; end

Public Instance Methods

paranoid?() click to toggle source
# File lib/paranoia.rb, line 243
def paranoid? ; self.class.paranoid? ; end
really_destroy!() click to toggle source
# File lib/paranoia.rb, line 189
def really_destroy!
  transaction do
    run_callbacks(:real_destroy) do
      dependent_reflections = self.class.reflections.select do |name, reflection|
        reflection.options[:dependent] == :destroy
      end
      if dependent_reflections.any?
        dependent_reflections.each do |name, reflection|
          association_data = self.send(name)
          # has_one association can return nil
          # .paranoid? will work for both instances and classes
          next unless association_data && association_data.paranoid?
          if reflection.collection?
            next association_data.with_deleted.each(&:really_destroy!)
          end
          association_data.really_destroy!
        end
      end
      write_attribute(paranoia_column, current_time_from_proper_timezone)
      destroy_without_paranoia
    end
  end
end

Private Instance Methods

paranoia_column() click to toggle source
# File lib/paranoia.rb, line 247
def paranoia_column
  self.class.paranoia_column
end
paranoia_sentinel_value() click to toggle source
# File lib/paranoia.rb, line 251
def paranoia_sentinel_value
  self.class.paranoia_sentinel_value
end