mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
Merge pull request #223 from tchak/id-serialization-with-hooks
use `read_attribute_for_serialization` to serialize ids
This commit is contained in:
commit
f4916f113f
@ -124,12 +124,9 @@ module ActiveModel
|
|||||||
end
|
end
|
||||||
|
|
||||||
def serialize_ids
|
def serialize_ids
|
||||||
# Use pluck or select_columns if available
|
ids_key = "#{@name.to_s.singularize}_ids".to_sym
|
||||||
# return collection.ids if collection.respond_to?(:ids)
|
if !option(:embed_key) && source_serializer.object.respond_to?(ids_key)
|
||||||
ids_key = "#{key.to_s.singularize}_ids"
|
source_serializer.object.read_attribute_for_serialization(ids_key)
|
||||||
|
|
||||||
if !option(:include) && !option(:embed_key) && source_serializer.object.respond_to?(ids_key)
|
|
||||||
source_serializer.object.send(ids_key)
|
|
||||||
else
|
else
|
||||||
associated_object.map do |item|
|
associated_object.map do |item|
|
||||||
item.read_attribute_for_serialization(embed_key)
|
item.read_attribute_for_serialization(embed_key)
|
||||||
@ -203,6 +200,8 @@ module ActiveModel
|
|||||||
end
|
end
|
||||||
|
|
||||||
def serialize_ids
|
def serialize_ids
|
||||||
|
id_key = "#{@name}_id".to_sym
|
||||||
|
|
||||||
if polymorphic?
|
if polymorphic?
|
||||||
if associated_object
|
if associated_object
|
||||||
{
|
{
|
||||||
@ -212,8 +211,8 @@ module ActiveModel
|
|||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
elsif !option(:embed_key) && source_serializer.object.respond_to?("#{name}_id")
|
elsif !option(:embed_key) && source_serializer.object.respond_to?(id_key)
|
||||||
source_serializer.object.send("#{name}_id")
|
source_serializer.object.read_attribute_for_serialization(id_key)
|
||||||
elsif associated_object
|
elsif associated_object
|
||||||
associated_object.read_attribute_for_serialization(embed_key)
|
associated_object.read_attribute_for_serialization(embed_key)
|
||||||
else
|
else
|
||||||
|
|||||||
@ -379,6 +379,56 @@ class AssociationTest < ActiveModel::TestCase
|
|||||||
|
|
||||||
assert_equal 1, serialized_times
|
assert_equal 1, serialized_times
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_include_with_read_association_id_for_serialization_hook
|
||||||
|
@post_serializer_class.class_eval do
|
||||||
|
has_one :comment, :embed => :ids, :include => true
|
||||||
|
end
|
||||||
|
|
||||||
|
association_name = nil
|
||||||
|
@post.class_eval do
|
||||||
|
define_method :read_attribute_for_serialization, lambda { |name|
|
||||||
|
association_name = name
|
||||||
|
send(name)
|
||||||
|
}
|
||||||
|
define_method :comment_id, lambda {
|
||||||
|
@attributes[:comment].id
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
include_bare! :comment
|
||||||
|
|
||||||
|
assert_equal :comment_id, association_name
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:comment_id => 1
|
||||||
|
}, @hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_include_with_read_association_ids_for_serialization_hook
|
||||||
|
@post_serializer_class.class_eval do
|
||||||
|
has_many :comments, :embed => :ids, :include => false
|
||||||
|
end
|
||||||
|
|
||||||
|
association_name = nil
|
||||||
|
@post.class_eval do
|
||||||
|
define_method :read_attribute_for_serialization, lambda { |name|
|
||||||
|
association_name = name
|
||||||
|
send(name)
|
||||||
|
}
|
||||||
|
define_method :comment_ids, lambda {
|
||||||
|
@attributes[:comments].map(&:id)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
include_bare! :comments
|
||||||
|
|
||||||
|
assert_equal :comment_ids, association_name
|
||||||
|
|
||||||
|
assert_equal({
|
||||||
|
:comment_ids => [1]
|
||||||
|
}, @hash)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class InclusionTest < AssociationTest
|
class InclusionTest < AssociationTest
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user