mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 15:23:06 +00:00
sync with upstream
This commit is contained in:
@@ -15,6 +15,7 @@ module ActiveModel
|
||||
@object = object
|
||||
@scope = options[:scope]
|
||||
@root = options.fetch(:root, self.class._root)
|
||||
@polymorphic = options.fetch(:polymorphic, false)
|
||||
@meta_key = options[:meta_key] || :meta
|
||||
@meta = options[@meta_key]
|
||||
@each_serializer = options[:each_serializer]
|
||||
@@ -34,7 +35,7 @@ module ActiveModel
|
||||
|
||||
def serializer_for(item)
|
||||
serializer_class = @each_serializer || Serializer.serializer_for(item, namespace: @namespace) || DefaultSerializer
|
||||
serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except)
|
||||
serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except, polymorphic: @polymorphic)
|
||||
end
|
||||
|
||||
def serializable_object
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require 'active_model/array_serializer'
|
||||
require 'active_model/serializable'
|
||||
require 'active_model/serializer/associations'
|
||||
require 'active_model/serializer/association'
|
||||
require 'active_model/serializer/config'
|
||||
|
||||
require 'thread'
|
||||
@@ -138,6 +138,7 @@ end
|
||||
@object = object
|
||||
@scope = options[:scope]
|
||||
@root = options.fetch(:root, self.class._root)
|
||||
@polymorphic = options.fetch(:polymorphic, false)
|
||||
@meta_key = options[:meta_key] || :meta
|
||||
@meta = options[@meta_key]
|
||||
@wrap_in_array = options[:_wrap_in_array]
|
||||
@@ -146,7 +147,7 @@ end
|
||||
@key_format = options[:key_format]
|
||||
@context = options[:context]
|
||||
end
|
||||
attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format, :context
|
||||
attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format, :context, :polymorphic
|
||||
|
||||
def json_key
|
||||
key = if root == true || root.nil?
|
||||
@@ -242,9 +243,9 @@ end
|
||||
def serialize_ids(association)
|
||||
associated_data = send(association.name)
|
||||
if associated_data.respond_to?(:to_ary)
|
||||
associated_data.map { |elem| elem.read_attribute_for_serialization(association.embed_key) }
|
||||
associated_data.map { |elem| serialize_id(elem, association) }
|
||||
else
|
||||
associated_data.read_attribute_for_serialization(association.embed_key) if associated_data
|
||||
serialize_id(associated_data, association) if associated_data
|
||||
end
|
||||
end
|
||||
|
||||
@@ -277,9 +278,19 @@ end
|
||||
hash = attributes
|
||||
hash.merge! associations
|
||||
hash = convert_keys(hash) if key_format.present?
|
||||
hash = { :type => type_name(@object), type_name(@object) => hash } if @polymorphic
|
||||
@wrap_in_array ? [hash] : hash
|
||||
end
|
||||
alias_method :serializable_hash, :serializable_object
|
||||
|
||||
def serialize_id(elem, association)
|
||||
id = elem.read_attribute_for_serialization(association.embed_key)
|
||||
association.polymorphic? ? { id: id, type: type_name(elem) } : id
|
||||
end
|
||||
|
||||
def type_name(elem)
|
||||
elem.class.to_s.demodulize.underscore.to_sym
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
require 'active_model/default_serializer'
|
||||
require 'active_model/serializer/association/has_one'
|
||||
require 'active_model/serializer/association/has_many'
|
||||
|
||||
module ActiveModel
|
||||
class Serializer
|
||||
@@ -13,6 +15,7 @@ module ActiveModel
|
||||
@name = name.to_s
|
||||
@options = options
|
||||
self.embed = options.fetch(:embed) { CONFIG.embed }
|
||||
@polymorphic = options.fetch(:polymorphic, false)
|
||||
@embed_in_root = options.fetch(:embed_in_root) { options.fetch(:include) { CONFIG.embed_in_root } }
|
||||
@key_format = options.fetch(:key_format) { CONFIG.key_format }
|
||||
@embed_key = options[:embed_key] || :id
|
||||
@@ -25,13 +28,14 @@ module ActiveModel
|
||||
@serializer_from_options = serializer.is_a?(String) ? serializer.constantize : serializer
|
||||
end
|
||||
|
||||
attr_reader :name, :embed_ids, :embed_objects
|
||||
attr_reader :name, :embed_ids, :embed_objects, :polymorphic
|
||||
attr_accessor :embed_in_root, :embed_key, :key, :embedded_key, :root_key, :serializer_from_options, :options, :key_format, :embed_in_root_key, :embed_namespace
|
||||
alias embed_ids? embed_ids
|
||||
alias embed_objects? embed_objects
|
||||
alias embed_in_root? embed_in_root
|
||||
alias embed_in_root_key? embed_in_root_key
|
||||
alias embed_namespace? embed_namespace
|
||||
alias polymorphic? polymorphic
|
||||
|
||||
def embed=(embed)
|
||||
@embed_ids = embed == :id || embed == :ids
|
||||
@@ -49,54 +53,6 @@ module ActiveModel
|
||||
def build_serializer(object, options = {})
|
||||
serializer_class(object, options).new(object, options.merge(self.options))
|
||||
end
|
||||
|
||||
class HasOne < Association
|
||||
def initialize(name, *args)
|
||||
super
|
||||
@root_key = @embedded_key.to_s.pluralize
|
||||
@key ||= "#{name}_id"
|
||||
end
|
||||
|
||||
def serializer_class(object, options = {})
|
||||
serializer_from_options || serializer_from_object(object, options) || default_serializer
|
||||
end
|
||||
|
||||
def build_serializer(object, options = {})
|
||||
options[:_wrap_in_array] = embed_in_root?
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
class HasMany < Association
|
||||
def initialize(name, *args)
|
||||
super
|
||||
@root_key = @embedded_key
|
||||
@key ||= "#{name.to_s.singularize}_ids"
|
||||
end
|
||||
|
||||
def serializer_class(object, _ = {})
|
||||
if use_array_serializer?
|
||||
ArraySerializer
|
||||
else
|
||||
serializer_from_options
|
||||
end
|
||||
end
|
||||
|
||||
def options
|
||||
if use_array_serializer?
|
||||
{ each_serializer: serializer_from_options }.merge! super
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def use_array_serializer?
|
||||
!serializer_from_options ||
|
||||
serializer_from_options && !(serializer_from_options <= ArraySerializer)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
36
lib/active_model/serializer/association/has_many.rb
Normal file
36
lib/active_model/serializer/association/has_many.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
module ActiveModel
|
||||
class Serializer
|
||||
class Association
|
||||
class HasMany < Association
|
||||
def initialize(name, *args)
|
||||
super
|
||||
@root_key = @embedded_key
|
||||
@key ||= "#{name.to_s.singularize}_ids"
|
||||
end
|
||||
|
||||
def serializer_class(object, _)
|
||||
if use_array_serializer?
|
||||
ArraySerializer
|
||||
else
|
||||
serializer_from_options
|
||||
end
|
||||
end
|
||||
|
||||
def options
|
||||
if use_array_serializer?
|
||||
{ each_serializer: serializer_from_options }.merge! super
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def use_array_serializer?
|
||||
!serializer_from_options ||
|
||||
serializer_from_options && !(serializer_from_options <= ArraySerializer)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
22
lib/active_model/serializer/association/has_one.rb
Normal file
22
lib/active_model/serializer/association/has_one.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
module ActiveModel
|
||||
class Serializer
|
||||
class Association
|
||||
class HasOne < Association
|
||||
def initialize(name, *args)
|
||||
super
|
||||
@root_key = @embedded_key.to_s.pluralize
|
||||
@key ||= "#{name}_id"
|
||||
end
|
||||
|
||||
def serializer_class(object, options = {})
|
||||
serializer_from_options || serializer_from_object(object, options) || default_serializer
|
||||
end
|
||||
|
||||
def build_serializer(object, options = {})
|
||||
options[:_wrap_in_array] = embed_in_root?
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -9,7 +9,7 @@ begin
|
||||
require 'action_controller/serialization'
|
||||
require 'action_controller/serialization_test_case'
|
||||
|
||||
ActiveSupport.on_load(:after_initialize) do
|
||||
ActiveSupport.on_load(:action_controller) do
|
||||
if ::ActionController::Serialization.enabled
|
||||
ActionController::Base.send(:include, ::ActionController::Serialization)
|
||||
ActionController::TestCase.send(:include, ::ActionController::SerializationAssertions)
|
||||
|
||||
Reference in New Issue
Block a user