module ActiveRecord #:nodoc: module Reflection #:nodoc: module ClassMethods #:nodoc: # Update the default reflection switch so that :has_many_polymorphs types get instantiated. # It's not a composed method so we have to override the whole thing. def create_reflection(macro, name, options, active_record) case macro when :has_many, :belongs_to, :has_one, :has_and_belongs_to_many klass = options[:through] ? ThroughReflection : AssociationReflection reflection = klass.new(macro, name, options, active_record) when :composed_of reflection = AggregateReflection.new(macro, name, options, active_record) # added by has_many_polymorphs # when :has_many_polymorphs reflection = PolymorphicReflection.new(macro, name, options, active_record) end write_inheritable_hash :reflections, name => reflection reflection end end class PolymorphicError < ActiveRecordError #:nodoc: end =begin rdoc The reflection built by the has_many_polymorphs method. Inherits from ActiveRecord::Reflection::AssociationReflection. =end class PolymorphicReflection < ThroughReflection # Stub out the validity check. Has_many_polymorphs checks validity on macro creation, not on reflection. def check_validity! # nothing end # Return the source reflection. def source_reflection # normally is the has_many to the through model, but we return ourselves, # since there isn't a real source class for a polymorphic target self end # Set the classname of the target. Uses the join class name. def class_name # normally is the classname of the association target @class_name ||= options[:join_class_name] end end end end