aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-11-14 10:45:53 -0700
committerSean Griffin <sean@thoughtbot.com>2014-11-14 14:30:39 -0700
commit70d1b5a7f8e25b077168deaf592e0e58c3f2bdd1 (patch)
tree1f74f87d45b6f539f8378a44652a9571bb47bfd0 /activerecord/lib/active_record
parent114e9f2bdf9327ebadb1fc72400c1ef80c3f6c3b (diff)
downloadrails-70d1b5a7f8e25b077168deaf592e0e58c3f2bdd1.tar.gz
rails-70d1b5a7f8e25b077168deaf592e0e58c3f2bdd1.tar.bz2
rails-70d1b5a7f8e25b077168deaf592e0e58c3f2bdd1.zip
Revert "Improve performance of AR object instantiation"
This reverts commit 8fee923888192a658d8823b31e77ed0683dfd665. Conflicts: activerecord/lib/active_record/attribute_set/builder.rb This solution sucks, and is hard to actually apply across the board. Going to try other solutions
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r--activerecord/lib/active_record/attribute_set/builder.rb21
-rw-r--r--activerecord/lib/active_record/inheritance.rb12
-rw-r--r--activerecord/lib/active_record/persistence.rb28
-rw-r--r--activerecord/lib/active_record/querying.rb2
-rw-r--r--activerecord/lib/active_record/result.rb9
5 files changed, 11 insertions, 61 deletions
diff --git a/activerecord/lib/active_record/attribute_set/builder.rb b/activerecord/lib/active_record/attribute_set/builder.rb
index 0a62c68bfb..d4a787f2fe 100644
--- a/activerecord/lib/active_record/attribute_set/builder.rb
+++ b/activerecord/lib/active_record/attribute_set/builder.rb
@@ -8,33 +8,18 @@ module ActiveRecord
end
def build_from_database(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)
+ attributes = build_attributes_from_values(values, additional_types)
add_uninitialized_attributes(attributes)
AttributeSet.new(attributes)
end
private
- 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]
+ def build_attributes_from_values(values, additional_types)
+ values.each_with_object({}) do |(name, value), hash|
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)
diff --git a/activerecord/lib/active_record/inheritance.rb b/activerecord/lib/active_record/inheritance.rb
index 4aad3217cb..f58145ab05 100644
--- a/activerecord/lib/active_record/inheritance.rb
+++ b/activerecord/lib/active_record/inheritance.rb
@@ -165,19 +165,15 @@ module ActiveRecord
# record instance. For single-table inheritance, we check the record
# for a +type+ column and return the corresponding class.
def discriminate_class_for_record(record)
- discriminate_class_for_value(record[inheritance_column])
- end
-
- def discriminate_class_for_value(value)
- if using_single_table_inheritance?(value)
- find_sti_class(value)
+ if using_single_table_inheritance?(record)
+ find_sti_class(record[inheritance_column])
else
super
end
end
- def using_single_table_inheritance?(value)
- value.present? && columns_hash.include?(inheritance_column)
+ def using_single_table_inheritance?(record)
+ record[inheritance_column].present? && columns_hash.include?(inheritance_column)
end
def find_sti_class(type_name)
diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb
index 06c8bceb30..507faf2879 100644
--- a/activerecord/lib/active_record/persistence.rb
+++ b/activerecord/lib/active_record/persistence.rb
@@ -65,41 +65,19 @@ module ActiveRecord
# how this "single-table" inheritance mapping is implemented.
def instantiate(attributes, column_types = {})
klass = discriminate_class_for_record(attributes)
- klass.instantiate_pairs(attributes.keys, attributes.values, column_types)
- end
-
- def instantiate_pairs(columns, values, column_types = {}) # :nodoc:
- attributes = attributes_builder.build_from_database_pairs(columns, values, column_types)
- allocate.init_with('attributes' => attributes, 'new_record' => false)
- end
-
- def instantiate_result_set(result_set, column_types = {}) # :nodoc:
- inheritance_column_index = inheritance_column && result_set.columns.find_index(inheritance_column)
-
- result_set.each_pair.map do |columns, values|
- inheritance_value = inheritance_column_index && values[inheritance_column_index]
- klass = discriminate_class_for_value(inheritance_value)
- klass.instantiate_pairs(columns, values, column_types)
- end
+ attributes = klass.attributes_builder.build_from_database(attributes, column_types)
+ klass.allocate.init_with('attributes' => attributes, 'new_record' => false)
end
private
# Called by +instantiate+ to decide which class to use for a new
# record instance.
#
- # See +ActiveRecord::Inheritance#discriminate_class_for_value+ for
+ # See +ActiveRecord::Inheritance#discriminate_class_for_record+ for
# the single-table inheritance discriminator.
- def discriminate_class_for_value(*)
- self
- end
-
def discriminate_class_for_record(record)
self
end
-
- def inheritance_column
- nil
- end
end
# Returns true if this object hasn't been saved yet -- that is, a record
diff --git a/activerecord/lib/active_record/querying.rb b/activerecord/lib/active_record/querying.rb
index 9d4df81b07..e8de4db3a7 100644
--- a/activerecord/lib/active_record/querying.rb
+++ b/activerecord/lib/active_record/querying.rb
@@ -47,7 +47,7 @@ module ActiveRecord
}
message_bus.instrument('instantiation.active_record', payload) do
- instantiate_result_set(result_set, column_types)
+ result_set.map { |record| instantiate(record, column_types) }
end
end
diff --git a/activerecord/lib/active_record/result.rb b/activerecord/lib/active_record/result.rb
index c84ad586e2..3a3e65ef32 100644
--- a/activerecord/lib/active_record/result.rb
+++ b/activerecord/lib/active_record/result.rb
@@ -54,15 +54,6 @@ module ActiveRecord
end
end
- def each_pair
- return to_enum(__method__) unless block_given?
-
- columns = @columns.map { |c| c.dup.freeze }
- @rows.each do |row|
- yield columns, row
- end
- end
-
def to_hash
hash_rows
end