module ActiveRecord::ActsAsRelation::ActsAsModules

Public Class Methods

[](acts_as) click to toggle source
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 5
def [](acts_as)
  if const_defined? acts_as.module_name
    const_get acts_as.module_name
  else
    acts_as_module = Module.new
    const_set acts_as.module_name, acts_as_module
    acts_as.module = acts_as_module
    create_assocication(acts_as)
    autobuild_superclass(acts_as)
    validate_superclass(acts_as)
    make_superclass_methods_accessible(acts_as)
    make_superclass_attributes_accessible(acts_as)
    fix_is_a(acts_as)
  end
end
autobuild_superclass(acts_as) click to toggle source
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 40
def autobuild_superclass(acts_as)
  acts_as.module.module_eval do
    define_method "#{acts_as.name}_with_autobuild" do
      send("#{acts_as.name}_without_autobuild") || send("build_#{acts_as.name}")
    end
  end
end
create_assocication(acts_as) click to toggle source
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 21
def create_assocication(acts_as)
  acts_as.module.extend ActiveSupport::Concern
  acts_as.module.included do
    has_one acts_as.name, acts_as.scope, acts_as.has_one_options
    default_scope -> { eager_load(acts_as.name) }

    alias_method_chain acts_as.name, :autobuild

    validate "#{acts_as.name}_must_be_valid".to_sym

    extend ActiveRecord::ActsAsRelation::AccessMethods
    define_acts_as_accessors(acts_as.name)

    if defined?(::ProtectedAttributes)
      attr_accessible.update(acts_as.model.attr_accessible)
    end
  end
end
fix_is_a(acts_as) click to toggle source
Calls superclass method
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 67
def fix_is_a(acts_as)
  acts_as.module.module_eval do
    define_method :is_a? do |klass|
      klass.name == acts_as.class_name ? true : super(klass)
    end
    alias_method :acts_as?, :is_a?
  end
end
make_superclass_attributes_accessible(acts_as) click to toggle source
Calls superclass method
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 76
def make_superclass_attributes_accessible(acts_as)
  acts_as.module.module_eval do
    define_method :[] do |key|
      if acts_as.parent_relations.include?(key.to_s)
        send(acts_as.name)[key]
      else
        super(key)
      end
    end

    define_method :[]= do |key, value|
      if acts_as.parent_relations.include?(key.to_s)
        send(acts_as.name)[key] = value
      else
        super(key, value)
      end
    end
  end
end
make_superclass_methods_accessible(acts_as) click to toggle source
Calls superclass method
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 48
def make_superclass_methods_accessible(acts_as)
  acts_as.module.module_eval do
    define_method :method_missing do |method, *arg, &block|
      if (method.to_s == 'id' || method.to_s == acts_as.name) || !send(acts_as.name).respond_to?(method)
        super(method, *arg, &block)
      else
        class_eval do
          delegate method, to: acts_as.name
        end
        send(acts_as.name).send(method, *arg, &block)
      end
    end

    define_method :respond_to? do |method, include_private_methods = false|
      super(method, include_private_methods) || send(acts_as.name).respond_to?(method, include_private_methods)
    end
  end
end
validate_superclass(acts_as) click to toggle source
# File lib/active_record/acts_as_relation/acts_as_modules.rb, line 96
def validate_superclass(acts_as)
  acts_as.module.module_eval do
    define_method "#{acts_as.name}_must_be_valid" do
      unless send(acts_as.name).valid?
        send(acts_as.name).errors.each do |att, message|
          errors.add(att, message)
        end
      end
    end
    protected "#{acts_as.name}_must_be_valid".to_sym
  end
end