Module: ActiveRecord::Temporal::Patches::JoinDependency
- Defined in:
- lib/activerecord/temporal/patches/join_dependency.rb
Overview
This is a copy of a fix from https://github.com/rails/rails/pull/56088 that impacts this gem. I has been merged and backported to supported stable versions of Active Record, but until those patches are released it's included here.
Instance Method Summary collapse
Instance Method Details
#instantiate(result_set, strict_loading_value, &block) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/activerecord/temporal/patches/join_dependency.rb', line 8 def instantiate(result_set, strict_loading_value, &block) primary_key = Array(join_root.primary_key).map { |column| aliases.column_alias(join_root, column) } seen = Hash.new { |i, parent| i[parent] = Hash.new { |j, child_class| j[child_class] = {} } }.compare_by_identity model_cache = Hash.new { |h, klass| h[klass] = {} } parents = model_cache[join_root] column_aliases = aliases.column_aliases(join_root) column_names = [] result_set.columns.each do |name| column_names << name unless /\At\d+_r\d+\z/.match?(name) end if column_names.empty? column_types = {} else column_types = result_set.column_types unless column_types.empty? attribute_types = join_root.attribute_types column_types = column_types.slice(*column_names).delete_if { |k, _| attribute_types.key?(k) } end column_aliases += column_names.map! { |name| Aliases::Column.new(name, name) } end = ActiveSupport::Notifications.instrumenter payload = { record_count: result_set.length, class_name: join_root.base_klass.name } .instrument("instantiation.active_record", payload) do result_set.each { |row_hash| parent_key = primary_key.empty? ? row_hash : row_hash.values_at(*primary_key) parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, column_types, &block) construct(parent, join_root, row_hash, seen, model_cache, strict_loading_value) } end parents.values end |