diff options
author | Michael Koziarski <michael@koziarski.com> | 2007-10-06 00:48:43 +0000 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2007-10-06 00:48:43 +0000 |
commit | 4db718e2bb514be7a2e76e56cb5027c4007528b4 (patch) | |
tree | f7eae1f1a6f56d2f63e5afdcc805ea6fc4d58178 /activerecord/lib/active_record/attribute_methods.rb | |
parent | b96c298f47d38bf9a5fd5f08511eb2e6dce7ff3e (diff) | |
download | rails-4db718e2bb514be7a2e76e56cb5027c4007528b4.tar.gz rails-4db718e2bb514be7a2e76e56cb5027c4007528b4.tar.bz2 rails-4db718e2bb514be7a2e76e56cb5027c4007528b4.zip |
Only cache attributes which need it for performance reasons. Closes #9767 [skaes]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7752 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods.rb')
-rw-r--r-- | activerecord/lib/active_record/attribute_methods.rb | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index b17f72741a..dc0bd2d125 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -1,10 +1,13 @@ module ActiveRecord module AttributeMethods #:nodoc: DEFAULT_SUFFIXES = %w(= ? _before_type_cast) + ATTRIBUTE_TYPES_CACHED_BY_DEFAULT = [:datetime, :timestamp, :time, :date] def self.included(base) base.extend ClassMethods base.attribute_method_suffix *DEFAULT_SUFFIXES + base.cattr_accessor :attribute_types_cached_by_default, :instance_writer => false + base.attribute_types_cached_by_default = ATTRIBUTE_TYPES_CACHED_BY_DEFAULT end # Declare and check for suffixed attribute methods. @@ -88,6 +91,23 @@ module ActiveRecord alias :define_read_methods :define_attribute_methods + # +cache_attributes+ allows you to declare which converted attribute values should + # be cached. Usually caching only pays off for attributes with expensive conversion + # methods, like date columns (e.g. created_at, updated_at). + def cache_attributes(*attribute_names) + attribute_names.each {|attr| cached_attributes << attr.to_s} + end + + # returns the attributes where + def cached_attributes + @cached_attributes ||= + columns.select{|c| attribute_types_cached_by_default.include?(c.type)}.map(&:name).to_set + end + + def cache_attribute?(attr_name) + cached_attributes.include?(attr_name) + end + private # Suffixes a, ?, c become regexp /(a|\?|c)$/ def rebuild_attribute_method_regexp @@ -109,7 +129,10 @@ module ActiveRecord access_code = access_code.insert(0, "missing_attribute('#{attr_name}', caller) unless @attributes.has_key?('#{attr_name}'); ") end - evaluate_attribute_method attr_name, "def #{symbol}; @attributes_cache['#{attr_name}'] ||= begin; #{access_code}; end; end" + if cache_attribute?(attr_name) + access_code = "@attributes_cache['#{attr_name}'] ||= (#{access_code})" + end + evaluate_attribute_method attr_name, "def #{symbol}; #{access_code}; end" end # Define read method for serialized attribute. |