aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/attribute_set/builder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/attribute_set/builder.rb')
-rw-r--r--activerecord/lib/active_record/attribute_set/builder.rb21
1 files changed, 18 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/attribute_set/builder.rb b/activerecord/lib/active_record/attribute_set/builder.rb
index d4a787f2fe..92640f1579 100644
--- a/activerecord/lib/active_record/attribute_set/builder.rb
+++ b/activerecord/lib/active_record/attribute_set/builder.rb
@@ -8,18 +8,33 @@ module ActiveRecord
end
def build_from_database(values = {}, additional_types = {})
- attributes = build_attributes_from_values(values, additional_types)
+ build_from_database_pairs(values.keys, values.values, additional_types)
+ end
+
+ def build_from_database_pairs(columns = [], values = [], additional_types = {})
+ attributes = build_attributes_from_values(columns, values, additional_types)
add_uninitialized_attributes(attributes)
AttributeSet.new(attributes)
end
private
- def build_attributes_from_values(values, additional_types)
- values.each_with_object({}) do |(name, value), hash|
+ def build_attributes_from_values(columns, values, additional_types)
+ # We are performing manual iteration here as this method is a performance
+ # hotspot
+ hash = {}
+ index = 0
+ length = columns.length
+
+ while index < length
+ name = columns[index]
+ value = values[index]
type = additional_types.fetch(name, types[name])
hash[name] = Attribute.from_database(name, value, type)
+ index += 1
end
+
+ hash
end
def add_uninitialized_attributes(attributes)