module ActiveRecord::Acts::Versioner::ClassMethods

Public Class Methods

reloadable?() click to toggle source
# File lib/acts_as_versioner/acts_as_versioner.rb, line 51
def self.reloadable? ; false ; end

Public Instance Methods

acts_as_versioner(options = {}, &extension) click to toggle source
# File lib/acts_as_versioner/acts_as_versioner.rb, line 16
def acts_as_versioner(options = {}, &extension)
  include ActiveRecord::Acts::Versioner::InstanceMethods

  # don't allow multiple calls
  return if self.included_modules.include?(ActiveRecord::Acts::Versioner::ActMethods)

  send :include, ActiveRecord::Acts::Versioner::ActMethods

  cattr_accessor :versioned_class_name, :versioned_foreign_key, :versioned_table_name

  send :attr_accessor

  self.versioned_class_name         = options[:class_name]  || "#{base_class}#{ActiveRecord::Acts::Versioner::configurator[:default_versioned_class_name]}"
  self.versioned_table_name         = options[:table_name]  || "#{table_name_prefix}#{base_class.name.demodulize.underscore}#{ActiveRecord::Acts::Versioner::configurator[:default_versioned_table_name]}#{table_name_suffix}"
  self.versioned_foreign_key        = options[:versioned_foreign_key]  || "#{table_name_prefix}#{base_class.name.demodulize.underscore}_id"   # quick 'n' dirty fix

  if block_given?
    extension_module_name = "#{versioned_class_name}Extension"
    silence_warnings do
      self.const_set(extension_module_name, Module.new(&extension))
    end
    options[:extend] = self.const_get(extension_module_name)
  end

  class_eval do
    include options[:extend] if options[:extend].is_a?(Module)

    before_save :b_s
    before_destroy :b_d
    after_save :a_s
    after_destroy :a_d
  end

  # create the dynamic versioned model
  const_set(versioned_class_name, Class.new(ApplicationRecord)).class_eval do
    def self.reloadable? ; false ; end
  end

  versioned_class.table_name = "#{versioned_table_name}"
  versioned_class.belongs_to self.to_s.demodulize.underscore.to_sym, :class_name  => "#{self.to_s}::#{versioned_class_name}",  :foreign_key => versioned_foreign_key
  versioned_class.send :include, options[:extend] if options[:extend].is_a?(Module)
end