diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index a10a5069ac..4c0625b8db 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,13 @@ *SVN* +* Change belongs_to so that the foreign_key assumption is taken from the association name, not the class name. Closes #8992 [hasmanyjosh] + + OLD + belongs_to :visitor, :class_name => 'User' # => inferred foreign_key is user_id + + NEW + belongs_to :visitor, :class_name => 'User' # => inferred foreign_key is visitor_id + * Remove spurious tests from deprecated_associations_test, most of these aren't deprecated, and are duplicated in associations_test. Closes #8987 [lifofifo] * Make create! on a has_many :through association return the association object. Not the collection. Closes #8786 [lifofifo] diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index ca739eb5dc..b9839a8500 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -799,12 +799,6 @@ module ActiveRecord # :conditions => 'discounts > #{payments_count}' # belongs_to :attachable, :polymorphic => true def belongs_to(association_id, options = {}) - if options.include?(:class_name) && !options.include?(:foreign_key) - ::ActiveSupport::Deprecation.warn( - "The inferred foreign_key name will change in Rails 2.0 to use the association name instead of its class name when they differ. When using :class_name in belongs_to, use the :foreign_key option to explicitly set the key name to avoid problems in the transition.", - caller) - end - reflection = create_belongs_to_reflection(association_id, options) if reflection.options[:polymorphic] diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index 62184eeff2..3d76ffe776 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -207,7 +207,7 @@ module ActiveRecord def derive_primary_key_name if macro == :belongs_to - class_name.foreign_key + "#{name}_id" elsif options[:as] "#{options[:as]}_id" else diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb index bf6d8301a2..0db8d91099 100755 --- a/activerecord/test/associations_test.rb +++ b/activerecord/test/associations_test.rb @@ -409,13 +409,6 @@ class HasOneAssociationsTest < Test::Unit::TestCase end end - def test_deprecated_inferred_foreign_key - assert_not_deprecated { Company.belongs_to :firm } - assert_not_deprecated { Company.belongs_to :client, :foreign_key => "firm_id" } - assert_not_deprecated { Company.belongs_to :firm, :class_name => "Firm", :foreign_key => "client_of" } - assert_deprecated("inferred foreign_key name") { Company.belongs_to :client, :class_name => "Firm" } - end - end diff --git a/activerecord/test/reflection_test.rb b/activerecord/test/reflection_test.rb index cc06d31299..1ed5c2610c 100644 --- a/activerecord/test/reflection_test.rb +++ b/activerecord/test/reflection_test.rb @@ -111,6 +111,15 @@ class ReflectionTest < Test::Unit::TestCase assert_equal 'accounts', Firm.reflect_on_association(:account).table_name end + def test_belongs_to_inferred_foreign_key_from_assoc_name + Company.belongs_to :foo + assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name + Company.belongs_to :bar, :class_name => "Xyzzy" + assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name + Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id" + assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name + end + def test_association_reflection_in_modules assert_reflection MyApplication::Business::Firm, :clients_of_firm,