1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Perf: avoid dupes add fallback logic for coders

This commit is contained in:
Sam 2013-09-10 18:07:54 +10:00
parent e453aa91bb
commit 975c9c9d44
4 changed files with 16 additions and 12 deletions

View file

@ -109,13 +109,14 @@ module ActiveRecord
# We use #[] first as a perf optimization for non-nil values. See https://gist.github.com/jonleighton/3552829.
name = attr_name.to_s
@attributes_cache[name] || @attributes_cache.fetch(name) {
column = @columns_hash.fetch(name) {
return @attributes.fetch(name) {
if name == 'id' && self.class.primary_key != name
read_attribute(self.class.primary_key)
end
}
}
column = @column_types_override[name] if @column_types_override
column ||= @column_types[name]
return @attributes.fetch(name) {
if name == 'id' && self.class.primary_key != name
read_attribute(self.class.primary_key)
end
} unless column
value = @attributes.fetch(name) {
return block_given? ? yield(name) : nil

View file

@ -168,7 +168,8 @@ module ActiveRecord
defaults.each { |k, v| defaults[k] = v.dup if v.duplicable? }
@attributes = self.class.initialize_attributes(defaults)
@columns_hash = self.class.column_types.dup
@column_types_override = nil
@column_types = self.class.column_types
init_internals
init_changed_attributes
@ -193,7 +194,8 @@ module ActiveRecord
# post.title # => 'hello world'
def init_with(coder)
@attributes = self.class.initialize_attributes(coder['attributes'])
@columns_hash = self.class.column_types.merge(coder['column_types'] || {})
@column_types_override = coder['column_types']
@column_types = self.class.column_types
init_internals

View file

@ -383,9 +383,10 @@ module ActiveRecord
end
@attributes.update(fresh_object.instance_variable_get('@attributes'))
@columns_hash = fresh_object.instance_variable_get('@columns_hash')
@attributes_cache = {}
@column_types = self.class.column_types
@column_types_override = fresh_object.instance_variable_get('@columns_types_override')
@attributes_cache = {}
self
end

View file

@ -245,7 +245,7 @@ class SerializedAttributeTest < ActiveRecord::TestCase
Topic.create(content: myobj)
Topic.all.each do |topic|
type = topic.instance_variable_get("@columns_hash")["content"]
type = Topic.column_types["content"]
assert !type.instance_variable_get("@column").is_a?(ActiveRecord::AttributeMethods::Serialization::Type)
end
end