Skip to content

Commit d7980c6

Browse files
authored
Merge pull request rails#51754 from Shopify/replace-keys-allocations
Reduce allocations in BelongsToAssociation#replace_keys
2 parents dcbd6b0 + 06968f8 commit d7980c6

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

activerecord/lib/active_record/associations/belongs_to_association.rb

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,21 @@ def require_counter_update?
124124
end
125125

126126
def replace_keys(record, force: false)
127-
target_key_values = record ? Array(primary_key(record.class)).map { |key| record._read_attribute(key) } : []
128-
reflection_fk = Array(reflection.foreign_key)
127+
reflection_fk = reflection.foreign_key
128+
if reflection_fk.is_a?(Array)
129+
target_key_values = record ? Array(primary_key(record.class)).map { |key| record._read_attribute(key) } : []
130+
reflection_fk = Array(reflection.foreign_key)
131+
132+
if force || reflection_fk.map { |fk| owner._read_attribute(fk) } != target_key_values
133+
reflection_fk.each_with_index do |key, index|
134+
owner[key] = target_key_values[index]
135+
end
136+
end
137+
else
138+
target_key_value = record ? record._read_attribute(primary_key(record.class)) : nil
129139

130-
if force || reflection_fk.map { |fk| owner._read_attribute(fk) } != target_key_values
131-
reflection_fk.zip(target_key_values).each do |key, value|
132-
owner[key] = value
140+
if force || owner._read_attribute(reflection_fk) != target_key_value
141+
owner[reflection_fk] = target_key_value
133142
end
134143
end
135144
end

0 commit comments

Comments
 (0)