Fix lazy loaded nested associations

Fixes #129
This commit is contained in:
Tim Connor 2020-12-07 16:48:10 +13:00
parent 963cd77900
commit 599a5fe3b7
4 changed files with 49 additions and 0 deletions

View File

@ -66,6 +66,8 @@ module FastJsonapi
end
def record_hash(record, fieldset, includes_list, params = {})
includes_list = parse_includes_list(includes_list)
if cache_store_instance
cache_opts = record_cache_options(cache_store_options, fieldset, includes_list, params)
record_hash = cache_store_instance.fetch(record, **cache_opts) do
@ -153,6 +155,9 @@ module FastJsonapi
# @param includes_list [List] to be parsed
# @return [Hash]
def parse_includes_list(includes_list)
return {} unless includes_list.present?
return includes_list if includes_list.is_a?(Hash)
includes_list.each_with_object({}) do |include_item, include_sets|
include_base, include_remainder = include_item.to_s.split('.', 2)
include_sets[include_base.to_sym] ||= Set.new

View File

@ -31,6 +31,14 @@ class ActorSerializer < UserSerializer
) do |object|
object.movies
end
has_many(
:lazy_played_movies,
serializer: :movie
) do |object|
object.movies
end
end
class CamelCaseActorSerializer

View File

@ -72,6 +72,13 @@ class MovieSerializer
related: ->(obj) { obj.url(obj) }
}
)
has_many(
:lazy_actors,
id_method_name: :uid,
lazy_load_data: true
) do |object|
object.actors
end
has_one(
:creator,
object_method_name: :owner,

View File

@ -141,6 +141,35 @@ RSpec.describe JSONAPI::Serializer do
)
end
end
context 'with lazy loading' do
let(:params) do
{ include: ['lazy_actors.lazy_played_movies'] }
end
it do
actors_rel = movie.actors.map { |a| { 'id' => a.uid, 'type' => 'actor' } }
expect(serialized['data']).to have_relationship('lazy_actors').with_data(actors_rel)
expect(serialized['included']).to include(
have_type('actor')
.and(have_id(movie.actors[0].uid))
.and(
have_relationship('lazy_played_movies').with_data(
[{
'id' => movie.actors[0].movies[0].id,
'type' => 'movie'
}]
)
)
)
expect(serialized['included']).to include(
have_type('movie').and(have_id(movie.actors[0].movies[0].id))
)
end
end
end
end
end