From 4debc86bd329d31360272ed15459cde3b9af3a10 Mon Sep 17 00:00:00 2001 From: Lauro Caetano Date: Wed, 23 Apr 2014 23:51:00 -0300 Subject: Fix polymorphic eager load with foreign_key as String. The foreign_key could be `String` and just doing `owners_map[owner_key]` could return `nil`. To prevent this bug, we should `to_s` both keys if their types are different. Fixes #14734. --- .../associations/preloader/association.rb | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb index bf461070e0..5a172a417d 100644 --- a/activerecord/lib/active_record/associations/preloader/association.rb +++ b/activerecord/lib/active_record/associations/preloader/association.rb @@ -58,7 +58,11 @@ module ActiveRecord def owners_by_key @owners_by_key ||= owners.group_by do |owner| - owner[owner_key_name] + if owner_key_type == association_key_type + owner[owner_key_name] + else + owner[owner_key_name].to_s + end end end @@ -93,13 +97,24 @@ module ActiveRecord records_by_owner end + def association_key_type + @klass.column_types[association_key_name.to_s].type + end + + def owner_key_type + @model.column_types[owner_key_name.to_s].type + end + def load_slices(slices) @preloaded_records = slices.flat_map { |slice| records_for(slice) } @preloaded_records.map { |record| - [record, record[association_key_name]] + key = record[association_key_name] + key = key.to_s unless owner_key_type == association_key_type + + [record, key] } end -- cgit v1.2.3