Browse files

Merge pull request #12188 from SamSaffron/master

Perf: avoid dupes add fallback logic for coders
  • Loading branch information...
2 parents bca623b + 975c9c9 commit 3d60e9d5503b5f657336a8b7ee6345552ddb6c83 @tenderlove tenderlove committed Sep 11, 2013
View
15 activerecord/lib/active_record/attribute_methods/read.rb
@@ -109,13 +109,14 @@ def read_attribute(attr_name)
# 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
6 activerecord/lib/active_record/core.rb
@@ -168,7 +168,8 @@ def initialize(attributes = nil)
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 @@ def initialize(attributes = nil)
# 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
5 activerecord/lib/active_record/persistence.rb
@@ -383,9 +383,10 @@ def reload(options = nil)
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')
@carlosantoniodasilva
Ruby on Rails member

There was a typo over here on the instance var get call, which was raising tons of warning on travis, fixed in 423f3b8.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ @attributes_cache = {}
self
end
View
2 activerecord/test/cases/serialized_attribute_test.rb
@@ -245,7 +245,7 @@ def test_serialized_column_should_not_be_wrapped_twice
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

0 comments on commit 3d60e9d

Please sign in to comment.