JsonApi adapter: serialize association

This commit is contained in:
Tema Bolshakov 2014-08-29 11:37:27 +04:00
parent 6496b08464
commit 6bb4501f67
4 changed files with 88 additions and 37 deletions

View File

@ -3,19 +3,33 @@ module ActiveModel
class Adapter class Adapter
class JsonApiAdapter < Adapter class JsonApiAdapter < Adapter
def serializable_hash(options = {}) def serializable_hash(options = {})
hash = serializer.attributes @hash = serializer.attributes
associations = serializer.associations(only: [:id]).each_with_object({}) do |(attr, value), h| serializer.associations.each do |name, association|
h[attr] = case value @hash[:links] ||= {}
when ActiveModel::Serializer::ArraySerializer @hash[:linked] ||= {}
value.map(&:id) if association.respond_to?(:each)
when ActiveModel::Serializer add_links(name, association)
# process belongs_to association else
else add_link(name, association)
# what? end
end
end end
hash.merge(associations) @hash
end
def add_links(name, serializers)
@hash[:links][name] ||= []
@hash[:linked][name] ||= []
@hash[:links][name] += serializers.map(&:id)
@hash[:linked][name] += serializers.map(&:attributes)
end
def add_link(name, serializer)
plural_name = name.to_s.pluralize.to_sym
@hash[:linked][plural_name] ||= []
@hash[:links][name] = serializer.id
@hash[:linked][plural_name].push serializer.attributes
end end
end end
end end

View File

@ -0,0 +1,29 @@
require 'test_helper'
module ActiveModel
class Serializer
class Adapter
class JsonApiAdapter
class BelongsToTest < Minitest::Test
def setup
@post = Post.new(id: 42, title: 'New Post', body: 'Body')
@comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
@post.comments = [@comment]
@comment.post = @post
@serializer = CommentSerializer.new(@comment)
@adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@serializer)
end
def test_includes_post_id
assert_equal(42, @adapter.serializable_hash[:links][:post])
end
def test_includes_linked_post
assert_equal([{id: 42, title: 'New Post', body: 'Body'}], @adapter.serializable_hash[:linked][:posts])
end
end
end
end
end
end

View File

@ -0,0 +1,34 @@
require 'test_helper'
module ActiveModel
class Serializer
class Adapter
class JsonApiAdapter
class HasManyTest < Minitest::Test
def setup
@post = Post.new(title: 'New Post', body: 'Body')
@first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
@second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
@post.comments = [@first_comment, @second_comment]
@first_comment.post = @post
@second_comment.post = @post
@serializer = PostSerializer.new(@post)
@adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@serializer)
end
def test_includes_comment_ids
assert_equal([1, 2], @adapter.serializable_hash[:links][:comments])
end
def test_includes_linked_comments
assert_equal([
{id: 1, body: 'ZOMG A COMMENT'},
{id: 2, body: 'ZOMG ANOTHER COMMENT'}
], @adapter.serializable_hash[:linked][:comments])
end
end
end
end
end
end

View File

@ -1,26 +0,0 @@
require 'test_helper'
module ActiveModel
class Serializer
class Adapter
class JsonApiTest < Minitest::Test
def setup
@post = Post.new(title: 'New Post', body: 'Body')
@first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
@second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
@post.comments = [@first_comment, @second_comment]
@first_comment.post = @post
@second_comment.post = @post
@post_serializer = PostSerializer.new(@post)
@adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@post_serializer)
end
def test_includes_comment_ids
assert_equal([1, 2], @adapter.serializable_hash[:comments])
end
end
end
end
end