diff --git a/activerecord/lib/active_record/associations/join_dependency.rb b/activerecord/lib/active_record/associations/join_dependency.rb index 48d81440177a9f3c46394181da10e7b9341fb31a..d61e209e55c0e5332cb5143333f47ab32dbac612 100644 --- a/activerecord/lib/active_record/associations/join_dependency.rb +++ b/activerecord/lib/active_record/associations/join_dependency.rb @@ -207,19 +207,19 @@ def build_join_association(reflection, parent, join_type) end def construct(ar_parent, parent, row, rs) - parent.children.each do |node| - association = construct_association(ar_parent, parent, node, row, rs) - construct(association, node, row, rs) if association - end - end - - def construct_association(record, parent, join_part, row, rs) primary_key = parent.aliased_primary_key type_caster = rs.column_type primary_key - primary_id = type_caster.type_cast row[parent.aliased_primary_key] - return if record.id != primary_id + parent.children.each do |node| + primary_id = type_caster.type_cast row[primary_key] + if ar_parent.id == primary_id + association = construct_association(ar_parent, node, row) + construct(association, node, row, rs) if association + end + end + end + def construct_association(record, join_part, row) macro = join_part.reflection.macro if macro == :has_one return record.association(join_part.reflection.name).target if record.association_cache.key?(join_part.reflection.name)