class Caprese::Adapter::JsonApi::Relationship

Attributes

association[R]
parent_serializer[R]
serializable_resource_options[R]

Public Class Methods

new(parent_serializer, serializable_resource_options, association) click to toggle source

{jsonapi.org/format/#document-resource-object-related-resource-links Document Resource Object Related Resource Links} {jsonapi.org/format/#document-links Document Links} {jsonapi.org/format/#document-resource-object-linkage Document Resource Relationship Linkage} {jsonapi.org/format/#document-meta Document Meta}

# File lib/caprese/adapter/json_api/relationship.rb, line 9
def initialize(parent_serializer, serializable_resource_options, association)
  @parent_serializer = parent_serializer
  @association = association
  @serializable_resource_options = serializable_resource_options
end

Public Instance Methods

as_json() click to toggle source
# File lib/caprese/adapter/json_api/relationship.rb, line 15
def as_json
  hash = {}

  if association.include_data?
    hash[:data] = data_for(association)
  end

  links = links_for(association)
  hash[:links] = links if links.any?

  meta = meta_for(association)
  hash[:meta] = meta if meta

  hash
end

Private Instance Methods

data_for(association) click to toggle source

TODO(BF): Avoid db hit on belong_to_ releationship by using foreign_key on self

# File lib/caprese/adapter/json_api/relationship.rb, line 38
def data_for(association)
  if association.collection?
    data_for_many(association)
  else
    data_for_one(association)
  end
end
data_for_many(association) click to toggle source
# File lib/caprese/adapter/json_api/relationship.rb, line 58
def data_for_many(association)
  # TODO(BF): Process relationship without evaluating lazy_association
  collection_serializer = association.lazy_association.serializer
  if collection_serializer.respond_to?(:each)
    collection_serializer.map do |serializer|
      ResourceIdentifier.new(serializer, serializable_resource_options).as_json
    end
  elsif (virtual_value = association.virtual_value)
    virtual_value
  else
    []
  end
end
data_for_one(association) click to toggle source
# File lib/caprese/adapter/json_api/relationship.rb, line 46
def data_for_one(association)
  # TODO(BF): Process relationship without evaluating lazy_association
  serializer = association.lazy_association.serializer
  if (virtual_value = association.virtual_value)
    virtual_value
  elsif serializer && association.object
    ResourceIdentifier.new(serializer, serializable_resource_options).as_json
  else
    nil
  end
end
meta_for(association) click to toggle source
# File lib/caprese/adapter/json_api/relationship.rb, line 79
def meta_for(association)
  meta = association.meta
  meta.respond_to?(:call) ? parent_serializer.instance_eval(&meta) : meta
end