Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions lib/jsonapi-serializers/serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def links
def relationships
data = {}
# Merge in data for has_one relationships.
has_one_relationships.each do |attribute_name, object|
has_one_relationships.each do |attribute_name, attr_data|
formatted_attribute_name = format_name(attribute_name)

data[formatted_attribute_name] = {}
Expand All @@ -102,6 +102,7 @@ def relationships
data[formatted_attribute_name]['links']['related'] = links_related if links_related

if @_include_linkages.include?(formatted_attribute_name)
object = has_one_relationship(attribute_name, attr_data)
if object.nil?
# Spec: Resource linkage MUST be represented as one of the following:
# - null for empty to-one relationships.
Expand All @@ -120,7 +121,7 @@ def relationships
end

# Merge in data for has_many relationships.
has_many_relationships.each do |attribute_name, objects|
has_many_relationships.each do |attribute_name, attr_data|
formatted_attribute_name = format_name(attribute_name)

data[formatted_attribute_name] = {}
Expand All @@ -136,7 +137,7 @@ def relationships
# http://jsonapi.org/format/#document-structure-resource-relationships
if @_include_linkages.include?(formatted_attribute_name)
data[formatted_attribute_name].merge!({'data' => []})
objects = objects || []
objects = has_many_relationship(attribute_name, attr_data) || []
objects.each do |obj|
related_object_serializer = JSONAPI::Serializer.find_serializer(obj)
data[formatted_attribute_name]['data'] << {
Expand Down Expand Up @@ -165,21 +166,29 @@ def has_one_relationships
data = {}
self.class.to_one_associations.each do |attribute_name, attr_data|
next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless])
data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
data[attribute_name] = attr_data
end
data
end

def has_one_relationship(attribute_name, attr_data)
evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
end

def has_many_relationships
return {} if self.class.to_many_associations.nil?
data = {}
self.class.to_many_associations.each do |attribute_name, attr_data|
next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless])
data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
data[attribute_name] = attr_data
end
data
end

def has_many_relationship(attribute_name, attr_data)
evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block])
end

def should_include_attr?(if_method_name, unless_method_name)
# Allow "if: :show_title?" and "unless: :hide_title?" attribute options.
show_attr = true
Expand Down Expand Up @@ -358,11 +367,13 @@ def self.find_recursive_relationships(root_object, root_inclusion_tree, results)
is_valid_attr = false
if serializer.has_one_relationships.has_key?(unformatted_attr_name)
is_valid_attr = true
object = serializer.has_one_relationships[unformatted_attr_name]
attr_data = serializer.has_one_relationships[unformatted_attr_name]
object = serializer.has_one_relationship(unformatted_attr_name, attr_data)
elsif serializer.has_many_relationships.has_key?(unformatted_attr_name)
is_valid_attr = true
is_collection = true
object = serializer.has_many_relationships[unformatted_attr_name]
attr_data = serializer.has_many_relationships[unformatted_attr_name]
object = serializer.has_many_relationship(unformatted_attr_name, attr_data)
end
if !is_valid_attr
raise JSONAPI::Serializer::InvalidIncludeError.new(
Expand Down