Avoid generating full changes hash on every save
`changed_attribute_names_to_save` is called in `keys_for_partial_write`, which is called on every save when partial writes are enabled. We can avoid generating the full changes hash by asking the mutation tracker for just the names of the changed attributes. At minimum this saves one array allocation per attribute, but will also avoid calling `Attribute#original_value` which is expensive for serialized attributes.
This commit is contained in:
parent
d729bc7488
commit
b9e1c0c4d7
@ -11,6 +11,10 @@ def initialize(attributes)
|
||||
@forced_changes = Set.new
|
||||
end
|
||||
|
||||
def changed_attribute_names
|
||||
attr_names.select { |attr_name| changed?(attr_name) }
|
||||
end
|
||||
|
||||
def changed_values
|
||||
attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
|
||||
if changed?(attr_name)
|
||||
@ -76,6 +80,10 @@ def attr_names
|
||||
class NullMutationTracker # :nodoc:
|
||||
include Singleton
|
||||
|
||||
def changed_attribute_names(*)
|
||||
[]
|
||||
end
|
||||
|
||||
def changed_values(*)
|
||||
{}
|
||||
end
|
||||
|
@ -114,7 +114,7 @@ def changes_to_save
|
||||
|
||||
# Alias for +changed+
|
||||
def changed_attribute_names_to_save
|
||||
changes_to_save.keys
|
||||
mutations_from_database.changed_attribute_names
|
||||
end
|
||||
|
||||
# Alias for +changed_attributes+
|
||||
|
Loading…
Reference in New Issue
Block a user