diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2010-08-30 23:59:33 -0700 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2010-09-09 14:39:43 -0700 |
commit | e0e3adff0333cb23a63d61a2005cfc44f7f40b52 (patch) | |
tree | 860b17c3c1e6a7660ee5a73ee06c90ec073a414d | |
parent | d79b1aa0ba96641fd6d8c9f4e79fae27e4fa9a83 (diff) | |
download | rails-e0e3adff0333cb23a63d61a2005cfc44f7f40b52.tar.gz rails-e0e3adff0333cb23a63d61a2005cfc44f7f40b52.tar.bz2 rails-e0e3adff0333cb23a63d61a2005cfc44f7f40b52.zip |
Cheaper attribute reads and respond_to?. Add underscore-prefixed method aliased to the attribute name so it can be overridden but still called internally.
3 files changed, 12 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index 56e18eced0..7297af9f79 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -48,13 +48,13 @@ module ActiveRecord end def respond_to?(*args) - self.class.define_attribute_methods + self.class.define_attribute_methods unless self.class.attribute_methods_generated? super end protected def attribute_method?(attr_name) - attr_name == 'id' || attributes.include?(attr_name) + attr_name == 'id' || @attributes.include?(attr_name) end end end diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb index 083c8f88b1..01699746d8 100644 --- a/activerecord/lib/active_record/attribute_methods/read.rb +++ b/activerecord/lib/active_record/attribute_methods/read.rb @@ -70,13 +70,19 @@ module ActiveRecord if cache_attribute?(attr_name) access_code = "@attributes_cache['#{attr_name}'] ||= (#{access_code})" end - generated_attribute_methods.module_eval("def #{symbol}; #{access_code}; end", __FILE__, __LINE__) + generated_attribute_methods.module_eval("def _#{symbol}; #{access_code}; end; alias #{symbol} _#{symbol}", __FILE__, __LINE__) end end # Returns the value of the attribute identified by <tt>attr_name</tt> after it has been typecast (for example, # "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)). def read_attribute(attr_name) + send "_#{attr_name}" + rescue NoMethodError + _read_attribute attr_name + end + + def _read_attribute(attr_name) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' if !(value = @attributes[attr_name]).nil? @@ -89,8 +95,6 @@ module ActiveRecord else value end - else - nil end end diff --git a/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb b/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb index a258b3f431..d640b26b74 100644 --- a/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb +++ b/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb @@ -19,12 +19,13 @@ module ActiveRecord def define_method_attribute(attr_name) if create_time_zone_conversion_attribute?(attr_name, columns_hash[attr_name]) method_body, line = <<-EOV, __LINE__ + 1 - def #{attr_name}(reload = false) + def _#{attr_name}(reload = false) cached = @attributes_cache['#{attr_name}'] return cached if cached && !reload - time = read_attribute('#{attr_name}') + time = _read_attribute('#{attr_name}') @attributes_cache['#{attr_name}'] = time.acts_like?(:time) ? time.in_time_zone : time end + alias #{attr_name} _#{attr_name} EOV generated_attribute_methods.module_eval(method_body, __FILE__, line) else |