From b9c6e32bb9c5aa250648fd0bcd7fb8dae9454db9 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Jos=C3=A9=20Valim?= Date: Mon, 16 Mar 2009 23:27:21 +0100 Subject: [PATCH] Make associations have a namespaced class_name by default. This way a belongs_to :user inside an Admin::Account will have a default class name of Admin::User avoiding ::User from being called by mistake. --- activerecord/lib/active_record/associations.rb | 2 +- activerecord/lib/active_record/reflection.rb | 7 +++++-- activerecord/test/cases/reflection_test.rb | 6 ++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 6d25b36..c7f43ea 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1507,7 +1507,7 @@ module ActiveRecord reflection = create_reflection(:belongs_to, association_id, options, self) if options[:polymorphic] - reflection.options[:foreign_type] ||= reflection.class_name.underscore + "_type" + reflection.options[:foreign_type] ||= reflection.class_name.sub(/^::/, '').underscore + "_type" end reflection diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index 2d4c1d5..30b3170 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -129,7 +129,10 @@ module ActiveRecord private def derive_class_name - name.to_s.camelize + namespace = @active_record.name.to_s.split('::') + namespace.pop + namespace << name.to_s.camelize + "::#{namespace.join('::')}" end end @@ -227,7 +230,7 @@ module ActiveRecord private def derive_class_name - class_name = name.to_s.camelize + class_name = super class_name = class_name.singularize if [ :has_many, :has_and_belongs_to_many ].include?(macro) class_name end diff --git a/activerecord/test/cases/reflection_test.rb b/activerecord/test/cases/reflection_test.rb index db64bbb..9f41a0d 100644 --- a/activerecord/test/cases/reflection_test.rb +++ b/activerecord/test/cases/reflection_test.rb @@ -132,6 +132,12 @@ class ReflectionTest < ActiveRecord::TestCase def test_association_reflection_in_modules assert_reflection MyApplication::Business::Firm, + :clients, + :klass => MyApplication::Business::Client, + :class_name => '::MyApplication::Business::Client', + :table_name => 'companies' + + assert_reflection MyApplication::Business::Firm, :clients_of_firm, :klass => MyApplication::Business::Client, :class_name => 'Client', -- 1.5.4.3