Skip eval relationships object on belongs to

This commit is contained in:
Benjamin Fleischer 2017-04-30 18:31:35 -05:00
parent 273b7e7f30
commit 6e41528515
5 changed files with 46 additions and 7 deletions

View File

@ -38,6 +38,10 @@ module ActiveModel
reflection.options[:meta] reflection.options[:meta]
end end
def belongs_to?
reflection.foreign_key_on == :self
end
def polymorphic? def polymorphic?
true == reflection_options[:polymorphic] true == reflection_options[:polymorphic]
end end

View File

@ -2,6 +2,10 @@ module ActiveModel
class Serializer class Serializer
# @api private # @api private
class BelongsToReflection < Reflection class BelongsToReflection < Reflection
# @api private
def foreign_key_on
:self
end
end end
end end
end end

View File

@ -47,11 +47,23 @@ module ActiveModel
# #
# So you can inspect reflections in your Adapters. # So you can inspect reflections in your Adapters.
class Reflection < Field class Reflection < Field
attr_reader :foreign_key, :type
def initialize(*) def initialize(*)
super super
options[:links] = {} options[:links] = {}
options[:include_data_setting] = Serializer.config.include_data_default options[:include_data_setting] = Serializer.config.include_data_default
options[:meta] = nil options[:meta] = nil
@type = options.fetch(:type) do
class_name = options.fetch(:class_name, name.to_s.camelize.singularize)
class_name.underscore.pluralize.to_sym
end
@foreign_key =
if collection?
"#{name.to_s.singularize}_ids".to_sym
else
"#{name}_id".to_sym
end
end end
# @api public # @api public
@ -150,6 +162,11 @@ module ActiveModel
end end
end end
# @api private
def foreign_key_on
:related
end
# Build association. This method is used internally to # Build association. This method is used internally to
# build serializer's association by its reflection. # build serializer's association by its reflection.
# #

View File

@ -43,6 +43,12 @@ module ActiveModelSerializers
end end
def data_for_one(association) def data_for_one(association)
if association.belongs_to? &&
parent_serializer.object.respond_to?(association.reflection.foreign_key)
id = parent_serializer.object.send(association.reflection.foreign_key)
type = association.reflection.type.to_s
ResourceIdentifier.for_type_with_id(type, id, serializable_resource_options)
else
# TODO(BF): Process relationship without evaluating lazy_association # TODO(BF): Process relationship without evaluating lazy_association
serializer = association.lazy_association.serializer serializer = association.lazy_association.serializer
if (virtual_value = association.virtual_value) if (virtual_value = association.virtual_value)
@ -53,6 +59,7 @@ module ActiveModelSerializers
nil nil
end end
end end
end
def data_for_many(association) def data_for_many(association)
# TODO(BF): Process relationship without evaluating lazy_association # TODO(BF): Process relationship without evaluating lazy_association

View File

@ -22,6 +22,13 @@ module ActiveModelSerializers
JsonApi.send(:transform_key_casing!, raw_type, transform_options) JsonApi.send(:transform_key_casing!, raw_type, transform_options)
end end
def self.for_type_with_id(type, id, options)
{
id: id.to_s,
type: type_for(:no_class_needed, type, options)
}
end
# {http://jsonapi.org/format/#document-resource-identifier-objects Resource Identifier Objects} # {http://jsonapi.org/format/#document-resource-identifier-objects Resource Identifier Objects}
def initialize(serializer, options) def initialize(serializer, options)
@id = id_for(serializer) @id = id_for(serializer)