From b483a0d2a75bbec2f5eee363c88238cb612f07d6 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 13 Jun 2013 09:46:30 -0700 Subject: Ambiguous reflections are on :through relationships are no longer supported. For example, you need to change this: class Author < ActiveRecord::Base has_many :posts has_many :taggings, :through => :posts end class Post < ActiveRecord::Base has_one :tagging has_many :taggings end class Tagging < ActiveRecord::Base end To this: class Author < ActiveRecord::Base has_many :posts has_many :taggings, :through => :posts, :source => :tagging end class Post < ActiveRecord::Base has_one :tagging has_many :taggings end class Tagging < ActiveRecord::Base end --- activerecord/lib/active_record/reflection.rb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'activerecord/lib/active_record') diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index 2aec73bd5b..dd437bd066 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -499,6 +499,11 @@ module ActiveRecord delegate :foreign_key, :foreign_type, :association_foreign_key, :active_record_primary_key, :type, :to => :source_reflection + def initialize(macro, name, scope, options, active_record) + super + @source_reflection = nil + end + # Returns the source of the through reflection. It checks both a singularized # and pluralized form for :belongs_to or :has_many. # @@ -517,7 +522,28 @@ module ActiveRecord # # => # def source_reflection - @source_reflection ||= source_reflection_names.collect { |name| through_reflection.klass.reflect_on_association(name) }.compact.first + return @source_reflection if @source_reflection + + reflections = source_reflection_names.collect { |name| + through_reflection.klass.reflect_on_association(name) + }.compact + + if reflections.length > 1 + example_options = options.dup + example_options[:source] = source_reflection_names.first + ActiveSupport::Deprecation.warn <<-eowarn +Ambiguous source reflection for through association. Please specify a :source +directive on your declaration like: + + class #{active_record.name} < ActiveRecord::Base + #{macro} :#{name}, #{example_options} + end + + eowarn + @source_reflection = reflections.first + else + @source_reflection = reflections.first + end end # Returns the AssociationReflection object specified in the :through option -- cgit v1.2.3