From f8877745e66e8e5b567770532c5a7a1bce5cf730 Mon Sep 17 00:00:00 2001 From: Ernie Miller Date: Thu, 11 Feb 2010 12:30:33 -0500 Subject: [PATCH 1/2] belongs_to associations now honor :primary_key option for joins --- activerecord/lib/active_record/associations.rb | 2 +- .../associations/belongs_to_associations_test.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 3ff8aba..eeaccd9 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -2173,7 +2173,7 @@ module ActiveRecord " #{join_type} %s ON %s.%s = %s.%s " % [ table_name_and_alias, connection.quote_table_name(aliased_table_name), - reflection.klass.primary_key, + reflection.options[:primary_key] || reflection.klass.primary_key, connection.quote_table_name(parent.aliased_table_name), options[:foreign_key] || reflection.primary_key_name ] diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb index 9f3945f..cccc5cd 100644 --- a/activerecord/test/cases/associations/belongs_to_associations_test.rb +++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb @@ -31,6 +31,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase assert_equal companies(:first_firm).name, client.firm_with_primary_key.name end + def test_belongs_to_with_primary_key_joins_on_correct_column + sql = Client.send(:construct_finder_sql, :joins => :firm_with_primary_key) + assert sql !~ /\.id/ + assert sql =~ /\.name/ + end + def test_proxy_assignment account = Account.find(1) assert_nothing_raised { account.firm = account.firm } -- 1.6.4.4 From 418e3152a1393b6ec43e678a6f01c809dd84f8cb Mon Sep 17 00:00:00 2001 From: Joey Aghion Date: Thu, 27 Aug 2009 16:06:44 -0400 Subject: [PATCH 2/2] use supplied primary key when eager-loading belongs_to associations rather than default primary key --- .../lib/active_record/association_preload.rb | 2 +- .../associations/belongs_to_associations_test.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletions(-) diff --git a/activerecord/lib/active_record/association_preload.rb b/activerecord/lib/active_record/association_preload.rb index 967fff4..3f769e4 100644 --- a/activerecord/lib/active_record/association_preload.rb +++ b/activerecord/lib/active_record/association_preload.rb @@ -323,7 +323,7 @@ module ActiveRecord klass = klass_name.constantize table_name = klass.quoted_table_name - primary_key = klass.primary_key + primary_key = reflection.options[:primary_key] || klass.primary_key column_type = klass.columns.detect{|c| c.name == primary_key}.type ids = id_map.keys.map do |id| if column_type == :integer diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb index cccc5cd..6a6fda1 100644 --- a/activerecord/test/cases/associations/belongs_to_associations_test.rb +++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb @@ -65,6 +65,13 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase citibank.firm_with_primary_key = apple assert_equal apple.name, citibank.firm_name end + + def test_eager_loading_with_primary_key + apple = Firm.create("name" => "Apple") + citibank = Client.create("name" => "Citibank", :firm_name => "Apple") + citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key) + assert_not_nil citibank_result.instance_variable_get("@firm_with_primary_key") + end def test_no_unexpected_aliasing first_firm = companies(:first_firm) -- 1.6.4.4