From f6b5046305d43c5f64bcb6fed0e44f7bca99a603 Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Thu, 1 Dec 2011 22:47:12 +0000 Subject: Roflscaling! Don't prefix the name with attribute_. Avoids a string allocation on read_attribute, which is a bit faster. --- .../lib/active_record/attribute_methods/primary_key.rb | 4 ++-- activerecord/lib/active_record/attribute_methods/read.rb | 15 ++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/attribute_methods/primary_key.rb b/activerecord/lib/active_record/attribute_methods/primary_key.rb index c756924186..7fbb459c34 100644 --- a/activerecord/lib/active_record/attribute_methods/primary_key.rb +++ b/activerecord/lib/active_record/attribute_methods/primary_key.rb @@ -31,9 +31,9 @@ module ActiveRecord if attr_name == primary_key && attr_name != 'id' generated_attribute_methods.send(:alias_method, :id, primary_key) generated_attribute_methods.module_eval <<-CODE, __FILE__, __LINE__ - def self.attribute_id(v, attributes, attributes_cache, attr_name) + def self.id(v, attributes, attributes_cache, attr_name) attr_name = '#{primary_key}' - send(:'attribute_#{attr_name}', attributes[attr_name], attributes, attributes_cache, attr_name) + send(attr_name, attributes[attr_name], attributes, attributes_cache, attr_name) end CODE end diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb index ab2b7936f3..54949ce0e2 100644 --- a/activerecord/lib/active_record/attribute_methods/read.rb +++ b/activerecord/lib/active_record/attribute_methods/read.rb @@ -30,11 +30,9 @@ module ActiveRecord end def undefine_attribute_methods - if base_class == self - generated_attribute_methods.module_eval do - public_methods(false).each do |m| - singleton_class.send(:undef_method, m) if m.to_s =~ /^attribute_/ - end + if base_class == self && attribute_methods_generated? + column_names.each do |name| + generated_attribute_methods.singleton_class.send(:undef_method, name) end end @@ -67,7 +65,7 @@ module ActiveRecord def __temp__(v, attributes, attributes_cache, attr_name) #{external} end - alias_method 'attribute_#{attr_name}', :__temp__ + alias_method '#{attr_name}', :__temp__ undef_method :__temp__ STR end @@ -110,12 +108,11 @@ module ActiveRecord # "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)). def read_attribute(attr_name) attr_name = attr_name.to_s - accessor = "attribute_#{attr_name}" methods = self.class.generated_attribute_methods - if methods.respond_to?(accessor) + if methods.respond_to?(attr_name) if @attributes.has_key?(attr_name) || attr_name == 'id' - methods.send(accessor, @attributes[attr_name], @attributes, @attributes_cache, attr_name) + methods.send(attr_name, @attributes[attr_name], @attributes, @attributes_cache, attr_name) end elsif !self.class.attribute_methods_generated? # If we haven't generated the caster methods yet, do that and -- cgit v1.2.3