diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2011-01-11 15:16:09 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2011-01-11 15:16:09 -0800 |
commit | 8c71e8b18f0e589b5413a8e6b6d7336a5506c977 (patch) | |
tree | a64cc15c7ec1f18ddff7f739355d2838c303d82b /activerecord/lib/active_record/association_preload.rb | |
parent | af96018c9171a9021f915ec63bd0baf4cf5a8e39 (diff) | |
download | rails-8c71e8b18f0e589b5413a8e6b6d7336a5506c977.tar.gz rails-8c71e8b18f0e589b5413a8e6b6d7336a5506c977.tar.bz2 rails-8c71e8b18f0e589b5413a8e6b6d7336a5506c977.zip |
lazily instantiate AR objects in order to avoid NoMethodErrors
Diffstat (limited to 'activerecord/lib/active_record/association_preload.rb')
-rw-r--r-- | activerecord/lib/active_record/association_preload.rb | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/association_preload.rb b/activerecord/lib/active_record/association_preload.rb index 4c517e3339..68aaff175a 100644 --- a/activerecord/lib/active_record/association_preload.rb +++ b/activerecord/lib/active_record/association_preload.rb @@ -137,9 +137,9 @@ module ActiveRecord end end - def set_association_collection_records(id_to_record_map, reflection_name, associated_records, key) + def set_association_collection_records(id_to_parent_map, reflection_name, associated_records, key) associated_records.each do |associated_record| - parent_records = id_to_record_map[associated_record[key].to_s] + parent_records = id_to_parent_map[associated_record[key].to_s] add_preloaded_records_to_collection(parent_records, reflection_name, associated_record) end end @@ -199,7 +199,6 @@ module ActiveRecord right = Arel::Table.new(options[:join_table]).alias('t0') - join_condition = left[reflection.klass.primary_key].eq( right[reflection.association_foreign_key]) @@ -221,17 +220,24 @@ module ActiveRecord custom_conditions = append_conditions(reflection, preload_options) - all_associated_records = associated_records(ids) do |some_ids| + klass = associated_records_proxy.klass + + associated_records(ids) { |some_ids| method = in_or_equal(some_ids) conditions = right[reflection.foreign_key].send(*method) conditions = custom_conditions.inject(conditions) do |ast, cond| ast.and cond end - associated_records_proxy.where(conditions).to_a - end - - set_association_collection_records(id_to_record_map, reflection.name, all_associated_records, 'the_parent_record_id') + relation = associated_records_proxy.where(conditions) + klass.connection.select_all(relation.arel.to_sql, 'SQL', relation.bind_values) + }.map! { |row| + parent_records = id_to_record_map[row['the_parent_record_id'].to_s] + associated_record = klass.instantiate row + add_preloaded_records_to_collection( + parent_records, reflection.name, associated_record) + associated_record + } end def preload_has_one_association(records, reflection, preload_options={}) |