parent
963cd77900
commit
599a5fe3b7
@ -66,6 +66,8 @@ module FastJsonapi
|
|||||||
end
|
end
|
||||||
|
|
||||||
def record_hash(record, fieldset, includes_list, params = {})
|
def record_hash(record, fieldset, includes_list, params = {})
|
||||||
|
includes_list = parse_includes_list(includes_list)
|
||||||
|
|
||||||
if cache_store_instance
|
if cache_store_instance
|
||||||
cache_opts = record_cache_options(cache_store_options, fieldset, includes_list, params)
|
cache_opts = record_cache_options(cache_store_options, fieldset, includes_list, params)
|
||||||
record_hash = cache_store_instance.fetch(record, **cache_opts) do
|
record_hash = cache_store_instance.fetch(record, **cache_opts) do
|
||||||
@ -153,6 +155,9 @@ module FastJsonapi
|
|||||||
# @param includes_list [List] to be parsed
|
# @param includes_list [List] to be parsed
|
||||||
# @return [Hash]
|
# @return [Hash]
|
||||||
def parse_includes_list(includes_list)
|
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|
|
includes_list.each_with_object({}) do |include_item, include_sets|
|
||||||
include_base, include_remainder = include_item.to_s.split('.', 2)
|
include_base, include_remainder = include_item.to_s.split('.', 2)
|
||||||
include_sets[include_base.to_sym] ||= Set.new
|
include_sets[include_base.to_sym] ||= Set.new
|
||||||
|
8
spec/fixtures/actor.rb
vendored
8
spec/fixtures/actor.rb
vendored
@ -31,6 +31,14 @@ class ActorSerializer < UserSerializer
|
|||||||
) do |object|
|
) do |object|
|
||||||
object.movies
|
object.movies
|
||||||
end
|
end
|
||||||
|
|
||||||
|
has_many(
|
||||||
|
:lazy_played_movies,
|
||||||
|
serializer: :movie
|
||||||
|
) do |object|
|
||||||
|
object.movies
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class CamelCaseActorSerializer
|
class CamelCaseActorSerializer
|
||||||
|
7
spec/fixtures/movie.rb
vendored
7
spec/fixtures/movie.rb
vendored
@ -72,6 +72,13 @@ class MovieSerializer
|
|||||||
related: ->(obj) { obj.url(obj) }
|
related: ->(obj) { obj.url(obj) }
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
has_many(
|
||||||
|
:lazy_actors,
|
||||||
|
id_method_name: :uid,
|
||||||
|
lazy_load_data: true
|
||||||
|
) do |object|
|
||||||
|
object.actors
|
||||||
|
end
|
||||||
has_one(
|
has_one(
|
||||||
:creator,
|
:creator,
|
||||||
object_method_name: :owner,
|
object_method_name: :owner,
|
||||||
|
@ -141,6 +141,35 @@ RSpec.describe JSONAPI::Serializer do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user