Skip to content

Commit

Permalink
Merge pull request #1276 from kieran/0-8-stable
Browse files Browse the repository at this point in the history
[FIX] serializers were never including associations on cache hits
  • Loading branch information
bf4 committed Apr 1, 2016
2 parents 1a68492 + 82a870d commit e54d129
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 4 deletions.
9 changes: 5 additions & 4 deletions lib/active_model/serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -353,13 +353,16 @@ def as_json(options={})
# Returns a hash representation of the serializable
# object without the root.
def serializable_hash
if perform_caching?
@node = if perform_caching?
cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-hash']) do
_serializable_hash
end
else
_serializable_hash
end

include_associations! if @object.present? && _embed
@node
end

def include_associations!
Expand Down Expand Up @@ -476,9 +479,7 @@ def scope

def _serializable_hash
return nil if @object.nil?
@node = attributes
include_associations! if _embed
@node
attributes
end

def perform_caching?
Expand Down
81 changes: 81 additions & 0 deletions test/caching_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,42 @@ def read_attribute_for_serialization(name)
end
end

class Parent
def id
'parent1'
end

def name
'Kieran'
end

def children
[ Child.new ]
end

def read_attribute_for_serialization(name)
send name
end
end

class Child
def id
'child1'
end

def name
'Joshua'
end

def parent
Parent.new
end

def read_attribute_for_serialization(name)
send name
end
end

def test_serializers_have_a_cache_store
ActiveModel::Serializer.cache = NullStore.new

Expand Down Expand Up @@ -93,4 +129,49 @@ def cache_key
assert_equal instance.serializable_array, serializer.cache.read('array_serializer/cache-key/serializable-array')
assert_equal instance.to_json, serializer.cache.read('array_serializer/cache-key/to-json')
end

def test_cached_serializers_return_associations

child_serializer = Class.new(ActiveModel::Serializer) do
cached true
attributes :name

def self.to_s
'child_serializer'
end

def cache_key
object.name
end
end

parent_serializer = Class.new(ActiveModel::Serializer) do
cached true
attributes :name

has_many :children, serializer: child_serializer, embed: :ids, include: true

def self.to_s
'parent_serializer'
end

def cache_key
object.name
end
end


parent_serializer.cache = NullStore.new
child_serializer.cache = NullStore.new

instance = parent_serializer.new Parent.new, root: :parent

initial_keys = instance.as_json.keys

assert_equal(initial_keys, [:children, :parent])

cached_keys = instance.as_json.keys

assert_equal(cached_keys, [:children, :parent])
end
end

0 comments on commit e54d129

Please sign in to comment.