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/test/attribute_methods_test.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/test/attribute_methods_test.rb')
-rwxr-xr-x | activerecord/test/attribute_methods_test.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/activerecord/test/attribute_methods_test.rb b/activerecord/test/attribute_methods_test.rb index f16b264c35..8646afdcb5 100755 --- a/activerecord/test/attribute_methods_test.rb +++ b/activerecord/test/attribute_methods_test.rb @@ -2,6 +2,7 @@ require 'abstract_unit' require 'fixtures/topic' class AttributeMethodsTest < Test::Unit::TestCase + fixtures :topics def setup @old_suffixes = ActiveRecord::Base.send(:attribute_method_suffixes).dup @target = Class.new(ActiveRecord::Base) @@ -92,4 +93,54 @@ class AttributeMethodsTest < Test::Unit::TestCase end end end + + def test_only_time_related_columns_are_meant_to_be_cached_by_default + expected = %w(datetime timestamp time date).sort + assert_equal expected, ActiveRecord::Base.attribute_types_cached_by_default.map(&:to_s).sort +end + + def test_declaring_attributes_as_cached_adds_them_to_the_attributes_cached_by_default + default_attributes = Topic.cached_attributes + Topic.cache_attributes :replies_count + expected = default_attributes + ["replies_count"] + assert_equal expected.sort, Topic.cached_attributes.sort + Topic.instance_variable_set "@cached_attributes", nil + end + + def test_time_related_columns_are_actually_cached + column_types = %w(datetime timestamp time date).map(&:to_sym) + column_names = Topic.columns.select{|c| column_types.include?(c.type) }.map(&:name) + + assert_equal column_names.sort, Topic.cached_attributes.sort + assert_equal time_related_columns_on_topic.sort, Topic.cached_attributes.sort + end + + def test_accessing_cached_attributes_caches_the_converted_values_and_nothing_else + t = topics(:first) + cache = t.instance_variable_get "@attributes_cache" + + assert_not_nil cache + assert cache.empty? + + all_columns = Topic.columns.map(&:name) + cached_columns = time_related_columns_on_topic + uncached_columns = all_columns - cached_columns + + all_columns.each do |attr_name| + attribute_gets_cached = Topic.cache_attribute?(attr_name) + val = t.send attr_name unless attr_name == "type" + if attribute_gets_cached + assert cached_columns.include?(attr_name) + assert_equal val, cache[attr_name] + else + assert uncached_columns.include?(attr_name) + assert !cache.include?(attr_name) + end + end + end + + private + def time_related_columns_on_topic + Topic.columns.select{|c| [:time, :date, :datetime, :timestamp].include?(c.type)}.map(&:name) + end end |