mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-24 23:06:50 +00:00
Merge pull request #2288 from cintamani/patch-1
Change the fetch method to deal with recyclable key cache strategy
This commit is contained in:
commit
15b7974fac
@ -7,6 +7,7 @@ Breaking changes:
|
|||||||
Features:
|
Features:
|
||||||
|
|
||||||
Fixes:
|
Fixes:
|
||||||
|
- [#2288](https://github.com/rails-api/active_model_serializers/pull/2288). Fixes #2287. (@cintamani)
|
||||||
|
|
||||||
- [#2307](https://github.com/rails-api/active_model_serializers/pull/2307) Falsey attribute values should not be reevaluated.
|
- [#2307](https://github.com/rails-api/active_model_serializers/pull/2307) Falsey attribute values should not be reevaluated.
|
||||||
|
|
||||||
|
|||||||
2
Gemfile
2
Gemfile
@ -53,7 +53,7 @@ group :bench do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'sqlite3', platform: (@windows_platforms + [:ruby])
|
gem 'sqlite3', '~> 1.3.13', platform: (@windows_platforms + [:ruby])
|
||||||
platforms :jruby do
|
platforms :jruby do
|
||||||
if version == 'master' || version >= '5'
|
if version == 'master' || version >= '5'
|
||||||
gem 'activerecord-jdbcsqlite3-adapter', '~> 50'
|
gem 'activerecord-jdbcsqlite3-adapter', '~> 50'
|
||||||
|
|||||||
@ -283,7 +283,9 @@ module ActiveModel
|
|||||||
# Use object's cache_key if available, else derive a key from the object
|
# Use object's cache_key if available, else derive a key from the object
|
||||||
# Pass the `key` option to the `cache` declaration or override this method to customize the cache key
|
# Pass the `key` option to the `cache` declaration or override this method to customize the cache key
|
||||||
def object_cache_key
|
def object_cache_key
|
||||||
if object.respond_to?(:cache_key)
|
if object.respond_to?(:cache_key_with_version)
|
||||||
|
object.cache_key_with_version
|
||||||
|
elsif object.respond_to?(:cache_key)
|
||||||
object.cache_key
|
object.cache_key
|
||||||
elsif (serializer_cache_key = (serializer_class._cache_key || serializer_class._cache_options[:key]))
|
elsif (serializer_cache_key = (serializer_class._cache_key || serializer_class._cache_options[:key]))
|
||||||
object_time_safe = object.updated_at
|
object_time_safe = object.updated_at
|
||||||
|
|||||||
@ -55,6 +55,11 @@ module ActiveModelSerializers
|
|||||||
has_many :roles
|
has_many :roles
|
||||||
has_one :bio
|
has_one :bio
|
||||||
end
|
end
|
||||||
|
class AuthorSerializerWithCache < ActiveModel::Serializer
|
||||||
|
cache
|
||||||
|
|
||||||
|
attributes :name
|
||||||
|
end
|
||||||
|
|
||||||
class Blog < ::Model
|
class Blog < ::Model
|
||||||
attributes :name
|
attributes :name
|
||||||
@ -146,6 +151,65 @@ module ActiveModelSerializers
|
|||||||
@blog_serializer = BlogSerializer.new(@blog)
|
@blog_serializer = BlogSerializer.new(@blog)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_expiring_of_cache_at_update_of_record
|
||||||
|
original_cache_versioning = :none
|
||||||
|
|
||||||
|
if ARModels::Author.respond_to?(:cache_versioning)
|
||||||
|
original_cache_versioning = ARModels::Author.cache_versioning
|
||||||
|
ARModels::Author.cache_versioning = true
|
||||||
|
end
|
||||||
|
|
||||||
|
author = ARModels::Author.create(name: 'Foo')
|
||||||
|
author_json = AuthorSerializerWithCache.new(author).as_json
|
||||||
|
|
||||||
|
assert_equal 'Foo', author_json[:name]
|
||||||
|
|
||||||
|
author.update_attributes(name: 'Bar')
|
||||||
|
author_json = AuthorSerializerWithCache.new(author).as_json
|
||||||
|
|
||||||
|
expected = 'Bar'
|
||||||
|
actual = author_json[:name]
|
||||||
|
if ENV['APPVEYOR'] && actual != expected
|
||||||
|
skip('Cache expiration tests sometimes fail on Appveyor. FIXME :)')
|
||||||
|
else
|
||||||
|
assert_equal expected, actual
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
ARModels::Author.cache_versioning = original_cache_versioning unless original_cache_versioning == :none
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cache_expiration_in_collection_on_update_of_record
|
||||||
|
original_cache_versioning = :none
|
||||||
|
|
||||||
|
if ARModels::Author.respond_to?(:cache_versioning)
|
||||||
|
original_cache_versioning = ARModels::Author.cache_versioning
|
||||||
|
ARModels::Author.cache_versioning = true
|
||||||
|
end
|
||||||
|
|
||||||
|
foo = 'Foo'
|
||||||
|
foo2 = 'Foo2'
|
||||||
|
author = ARModels::Author.create(name: foo)
|
||||||
|
author2 = ARModels::Author.create(name: foo2)
|
||||||
|
author_collection = [author, author, author2]
|
||||||
|
|
||||||
|
collection_json = render_object_with_cache(author_collection, each_serializer: AuthorSerializerWithCache)
|
||||||
|
actual = collection_json
|
||||||
|
expected = [{ name: foo }, { name: foo }, { name: foo2 }]
|
||||||
|
if ENV['APPVEYOR'] && actual != expected
|
||||||
|
skip('Cache expiration tests sometimes fail on Appveyor. FIXME :)')
|
||||||
|
else
|
||||||
|
assert_equal expected, actual
|
||||||
|
end
|
||||||
|
|
||||||
|
bar = 'Bar'
|
||||||
|
author.update!(name: bar)
|
||||||
|
|
||||||
|
collection_json = render_object_with_cache(author_collection, each_serializer: AuthorSerializerWithCache)
|
||||||
|
assert_equal [{ name: bar }, { name: bar }, { name: foo2 }], collection_json
|
||||||
|
ensure
|
||||||
|
ARModels::Author.cache_versioning = original_cache_versioning unless original_cache_versioning == :none
|
||||||
|
end
|
||||||
|
|
||||||
def test_explicit_cache_store
|
def test_explicit_cache_store
|
||||||
default_store = Class.new(ActiveModel::Serializer) do
|
default_store = Class.new(ActiveModel::Serializer) do
|
||||||
cache
|
cache
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user