Class: SimpleJsonapi::Node::Relationship

Inherits:
Base
  • Object
show all
Defined in:
lib/simple_jsonapi/node/relationship.rb

Overview

Represents a single relationship object.

Instance Attribute Summary collapse

Attributes inherited from Base

#extras, #fields_spec, #include_spec, #root_node, #serializer, #serializer_inferrer, #sort_spec

Instance Method Summary collapse

Constructor Details

#initialize(resource:, relationship_definition:, **options) ⇒ Relationship

Returns a new instance of Relationship.

Parameters:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/simple_jsonapi/node/relationship.rb', line 14

def initialize(resource:, relationship_definition:, **options)
  super(options)

  @resource = resource
  @relationship_definition = relationship_definition

  if relationship_definition.singular?
    @data_node = build_child_node(
      SimpleJsonapi::Node::RelationshipData::Singular,
      relationship_definition: relationship_definition,
      resource: related_data,
      add_to_included: add_to_included?,
    )
  elsif relationship_definition.collection?
    @data_node = build_child_node(
      SimpleJsonapi::Node::RelationshipData::Collection,
      relationship_definition: relationship_definition,
      resources: related_data,
      add_to_included: add_to_included?,
    )
  end

  @links_node = build_child_node(
    SimpleJsonapi::Node::ObjectLinks,
    object: resource,
    link_definitions: relationship_definition.link_definitions,
  )

  @meta_node = build_child_node(
    SimpleJsonapi::Node::ObjectMeta,
    object: resource,
    meta_definitions: relationship_definition.meta_definitions,
  )
end

Instance Attribute Details

#relationship_definitionDefinition::Relationship (readonly)



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/simple_jsonapi/node/relationship.rb', line 8

class Relationship < Base
  attr_reader :resource, :relationship_definition

  # @param resource [Object]
  # @param relationship_definition [Definition::Relationship]
  # @param options see {Node::Base#initialize} for additional parameters
  def initialize(resource:, relationship_definition:, **options)
    super(options)

    @resource = resource
    @relationship_definition = relationship_definition

    if relationship_definition.singular?
      @data_node = build_child_node(
        SimpleJsonapi::Node::RelationshipData::Singular,
        relationship_definition: relationship_definition,
        resource: related_data,
        add_to_included: add_to_included?,
      )
    elsif relationship_definition.collection?
      @data_node = build_child_node(
        SimpleJsonapi::Node::RelationshipData::Collection,
        relationship_definition: relationship_definition,
        resources: related_data,
        add_to_included: add_to_included?,
      )
    end

    @links_node = build_child_node(
      SimpleJsonapi::Node::ObjectLinks,
      object: resource,
      link_definitions: relationship_definition.link_definitions,
    )

    @meta_node = build_child_node(
      SimpleJsonapi::Node::ObjectMeta,
      object: resource,
      meta_definitions: relationship_definition.meta_definitions,
    )
  end

  # @return [String]
  def relationship_name
    relationship_definition.name
  end

  # @return [Hash{Symbol => Hash}]
  def as_jsonapi
    rel_json = {}

    rel_json.merge!(@data_node.as_jsonapi) if @data_node
    rel_json.merge!(@links_node.as_jsonapi) if @links_node
    rel_json.merge!(@meta_node.as_jsonapi) if @meta_node

    rel_json
  end

  private

  def related_data
    @related_data ||= evaluate(
      relationship_definition.data_definition,
      resource,
      sort: sort_spec[relationship_name.to_sym],
    )
  end

  def add_to_included?
    include_spec.include?(relationship_name)
  end
end

#resourceObject (readonly)

Returns:

  • (Object)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/simple_jsonapi/node/relationship.rb', line 8

class Relationship < Base
  attr_reader :resource, :relationship_definition

  # @param resource [Object]
  # @param relationship_definition [Definition::Relationship]
  # @param options see {Node::Base#initialize} for additional parameters
  def initialize(resource:, relationship_definition:, **options)
    super(options)

    @resource = resource
    @relationship_definition = relationship_definition

    if relationship_definition.singular?
      @data_node = build_child_node(
        SimpleJsonapi::Node::RelationshipData::Singular,
        relationship_definition: relationship_definition,
        resource: related_data,
        add_to_included: add_to_included?,
      )
    elsif relationship_definition.collection?
      @data_node = build_child_node(
        SimpleJsonapi::Node::RelationshipData::Collection,
        relationship_definition: relationship_definition,
        resources: related_data,
        add_to_included: add_to_included?,
      )
    end

    @links_node = build_child_node(
      SimpleJsonapi::Node::ObjectLinks,
      object: resource,
      link_definitions: relationship_definition.link_definitions,
    )

    @meta_node = build_child_node(
      SimpleJsonapi::Node::ObjectMeta,
      object: resource,
      meta_definitions: relationship_definition.meta_definitions,
    )
  end

  # @return [String]
  def relationship_name
    relationship_definition.name
  end

  # @return [Hash{Symbol => Hash}]
  def as_jsonapi
    rel_json = {}

    rel_json.merge!(@data_node.as_jsonapi) if @data_node
    rel_json.merge!(@links_node.as_jsonapi) if @links_node
    rel_json.merge!(@meta_node.as_jsonapi) if @meta_node

    rel_json
  end

  private

  def related_data
    @related_data ||= evaluate(
      relationship_definition.data_definition,
      resource,
      sort: sort_spec[relationship_name.to_sym],
    )
  end

  def add_to_included?
    include_spec.include?(relationship_name)
  end
end

Instance Method Details

#as_jsonapiHash{Symbol => Hash}

Returns:

  • (Hash{Symbol => Hash})


55
56
57
58
59
60
61
62
63
# File 'lib/simple_jsonapi/node/relationship.rb', line 55

def as_jsonapi
  rel_json = {}

  rel_json.merge!(@data_node.as_jsonapi) if @data_node
  rel_json.merge!(@links_node.as_jsonapi) if @links_node
  rel_json.merge!(@meta_node.as_jsonapi) if @meta_node

  rel_json
end

#relationship_nameString

Returns:

  • (String)


50
51
52
# File 'lib/simple_jsonapi/node/relationship.rb', line 50

def relationship_name
  relationship_definition.name
end