Merge pull request #223 from tchak/id-serialization-with-hooks

use `read_attribute_for_serialization` to serialize ids
This commit is contained in:
Steve Klabnik 2013-03-08 09:17:19 -08:00
commit f4916f113f
2 changed files with 57 additions and 8 deletions

View File

@ -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

View File

@ -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