Merge pull request #15429 from sgrif/sg-rm-cached-attributes

rm cached attributes
This commit is contained in:
Rafael Mendonça França 2014-06-11 12:54:58 -03:00
commit 70b931f846
3 changed files with 25 additions and 74 deletions

View File

@ -1,3 +1,7 @@
* Remove `cache_attributes` and friends. All attributes are cached.
*Sean Griffin*
* Remove deprecated method `ActiveRecord::Base.quoted_locking_column`.
*Akshay Vishnoi*

View File

@ -35,35 +35,22 @@ module ActiveRecord
extend ActiveSupport::Concern
ATTRIBUTE_TYPES_CACHED_BY_DEFAULT = [:datetime, :time, :date]
included do
class_attribute :attribute_types_cached_by_default, instance_writer: false
self.attribute_types_cached_by_default = ATTRIBUTE_TYPES_CACHED_BY_DEFAULT
end
module ClassMethods
# +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 time related columns (e.g.
# +created_at+, +updated_at+).
def cache_attributes(*attribute_names)
cached_attributes.merge attribute_names.map { |attr| attr.to_s }
end
# Returns the attributes which are cached. By default time related columns
# with datatype <tt>:datetime, :time, :date</tt> are cached.
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
# Returns +true+ if the provided attribute is being cached.
def cache_attribute?(attr_name)
cached_attributes.include?(attr_name)
[:cache_attributes, :cached_attributes, :cache_attribute?].each do |method_name|
define_method method_name do |*|
cached_attributes_deprecation_warning(method_name)
true
end
end
protected
def cached_attributes_deprecation_warning(method_name)
ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
Calling `#{method_name}` is no longer necessary. All attributes are cached.
MESSAGE
end
if Module.methods_transplantable?
def define_method_attribute(name)
method = ReaderMethodCache[name]
@ -89,16 +76,6 @@ module ActiveRecord
end
end
end
private
def cacheable_column?(column)
if attribute_types_cached_by_default == ATTRIBUTE_TYPES_CACHED_BY_DEFAULT
true
else
attribute_types_cached_by_default.include?(column.type)
end
end
end
# Returns the value of the attribute identified by <tt>attr_name</tt> after
@ -122,11 +99,7 @@ module ActiveRecord
return block_given? ? yield(name) : nil
}
if self.class.cache_attribute?(name)
@attributes[name] = column.type_cast_from_database(value)
else
column.type_cast_from_database value
end
@attributes[name] = column.type_cast_from_database(value)
}
end

View File

@ -517,43 +517,17 @@ class AttributeMethodsTest < ActiveRecord::TestCase
end
end
def test_only_time_related_columns_are_meant_to_be_cached_by_default
expected = %w(datetime time date).sort
assert_equal expected, ActiveRecord::Base.attribute_types_cached_by_default.map(&:to_s).sort
end
def test_deprecated_cache_attributes
assert_deprecated do
Topic.cache_attributes :replies_count
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
assert_deprecated do
Topic.cached_attributes
end
def test_cacheable_columns_are_actually_cached
assert_equal cached_columns.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"
assert_not_nil cache
assert cache.empty?
all_columns = Topic.columns.map(&:name)
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
assert_deprecated do
Topic.cache_attribute? :replies_count
end
end