提交 5e86ee11 编写于 作者: R Ryuta Kamizono

Refactor `attributes_for_{create,update}` to avoid an extra allocation

Use `delete_if` instead of `reject` to avoid an extra allocation.
上级 56ca81a9
...@@ -459,7 +459,8 @@ def attributes_with_values(attribute_names) ...@@ -459,7 +459,8 @@ def attributes_with_values(attribute_names)
# Filters the primary keys and readonly attributes from the attribute names. # Filters the primary keys and readonly attributes from the attribute names.
def attributes_for_update(attribute_names) def attributes_for_update(attribute_names)
attribute_names.reject do |name| attribute_names &= self.class.column_names
attribute_names.delete_if do |name|
readonly_attribute?(name) readonly_attribute?(name)
end end
end end
...@@ -467,7 +468,8 @@ def attributes_for_update(attribute_names) ...@@ -467,7 +468,8 @@ def attributes_for_update(attribute_names)
# Filters out the primary keys, from the attribute names, when the primary # Filters out the primary keys, from the attribute names, when the primary
# key is to be generated (e.g. the id attribute has no value). # key is to be generated (e.g. the id attribute has no value).
def attributes_for_create(attribute_names) def attributes_for_create(attribute_names)
attribute_names.reject do |name| attribute_names &= self.class.column_names
attribute_names.delete_if do |name|
pk_attribute?(name) && id.nil? pk_attribute?(name) && id.nil?
end end
end end
......
...@@ -718,7 +718,6 @@ def create_or_update(*args, &block) ...@@ -718,7 +718,6 @@ def create_or_update(*args, &block)
# Updates the associated record with values matching those of the instance attributes. # Updates the associated record with values matching those of the instance attributes.
# Returns the number of affected rows. # Returns the number of affected rows.
def _update_record(attribute_names = self.attribute_names) def _update_record(attribute_names = self.attribute_names)
attribute_names &= self.class.column_names
attribute_names = attributes_for_update(attribute_names) attribute_names = attributes_for_update(attribute_names)
if attribute_names.empty? if attribute_names.empty?
...@@ -737,7 +736,6 @@ def _update_record(attribute_names = self.attribute_names) ...@@ -737,7 +736,6 @@ def _update_record(attribute_names = self.attribute_names)
# Creates a record with values matching those of the instance attributes # Creates a record with values matching those of the instance attributes
# and returns its id. # and returns its id.
def _create_record(attribute_names = self.attribute_names) def _create_record(attribute_names = self.attribute_names)
attribute_names &= self.class.column_names
attribute_names = attributes_for_create(attribute_names) attribute_names = attributes_for_create(attribute_names)
new_id = self.class._insert_record( new_id = self.class._insert_record(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册