Class: ROM::Associations::Abstract

Inherits:
Object
  • Object
show all
Extended by:
Initializer
Includes:
Memoizable
Defined in:
lib/rom/associations/abstract.rb

Overview

Abstract association class

API:

  • public

Direct Known Subclasses

ManyToMany, ManyToOne, OneToMany

Constant Summary

Constants included from Memoizable

Memoizable::MEMOIZED_HASH

Instance Attribute Summary collapse

Attributes included from Memoizable

#__memoized__

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Initializer

extended

Methods included from Memoizable

included

Instance Attribute Details

#definitionROM::Associations::Definition (readonly)

Returns Association configuration object.

Returns:

  • Association configuration object



23
# File 'lib/rom/associations/abstract.rb', line 23

param :definition

#relationsROM::RelationRegistry (readonly)

Returns Relation registry.

Returns:

  • Relation registry



27
# File 'lib/rom/associations/abstract.rb', line 27

option :relations, reader: true

#sourceROM::SQL::Relation (readonly)

Returns the source relation.

Returns:

  • the source relation



31
# File 'lib/rom/associations/abstract.rb', line 31

option :source, reader: true

#targetROM::SQL::Relation::Name (readonly)

Returns the target relation.

Returns:

  • the target relation



35
# File 'lib/rom/associations/abstract.rb', line 35

option :target, reader: true

Class Method Details

.new(definition, relations) ⇒ Object

Create an association object

Parameters:

  • The association definition object

  • The relation registry

API:

  • public



43
44
45
46
47
48
49
50
# File 'lib/rom/associations/abstract.rb', line 43

def self.new(definition, relations)
  super(
    definition,
    relations: relations,
    source: relations[definition.source.relation],
    target: relations[definition.target.relation]
  )
end

Instance Method Details

#aliased?Boolean

Return if an association has an alias

Returns:

API:

  • public



57
58
59
# File 'lib/rom/associations/abstract.rb', line 57

def aliased?
  definition.aliased?
end

#apply_view(schema, relation) ⇒ Relation

Applies custom view to the default association view

Returns:

API:

  • protected



132
133
134
135
# File 'lib/rom/associations/abstract.rb', line 132

def apply_view(schema, relation)
  view_rel = relation.public_send(view)
  schema.merge(view_rel.schema).uniq(&:key).(view_rel)
end

#asSymbol

Return association alias

Returns:

API:

  • public



66
67
68
# File 'lib/rom/associations/abstract.rb', line 66

def as
  definition.as
end

#combine_keysHash<Symbol=>Symbol>

Return combine keys hash

Combine keys are used for merging associated data together, typically these are the same as fk<=>pk mapping

Returns:

API:

  • public



145
146
147
# File 'lib/rom/associations/abstract.rb', line 145

def combine_keys
  definition.combine_keys || { source_key => target_key }
end

#foreign_keySymbol

Return association foreign key name

Returns:

API:

  • public



94
95
96
# File 'lib/rom/associations/abstract.rb', line 94

def foreign_key
  definition.foreign_key
end

#join_key_mapArray<Symbol>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return names of source PKs and target FKs

Returns:

API:

  • private



154
155
156
# File 'lib/rom/associations/abstract.rb', line 154

def join_key_map
  join_keys.to_a.flatten(1).map(&:key)
end

#keySymbol

Return the name of a key in tuples under which loaded association data are returned

Returns:

API:

  • public



123
124
125
# File 'lib/rom/associations/abstract.rb', line 123

def key
  as || name
end

#nameSymbol

Return association canonical name

Returns:

API:

  • public



75
76
77
# File 'lib/rom/associations/abstract.rb', line 75

def name
  definition.name
end

#nodeRelation

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return target relation configured as a combine node

Returns:

API:

  • private



163
164
165
166
167
168
# File 'lib/rom/associations/abstract.rb', line 163

def node
  target.with(
    name: target.name.as(key),
    meta: { keys: combine_keys, combine_type: result, combine_name: key }
  )
end

#override?Boolean

Return if a custom view should override default association view

Returns:

API:

  • public



114
115
116
# File 'lib/rom/associations/abstract.rb', line 114

def override?
  definition.override
end

#prepare(target) ⇒ Relation

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Prepare association’s target relation for composition

Returns:

API:

  • private



188
189
190
191
192
193
194
# File 'lib/rom/associations/abstract.rb', line 188

def prepare(target)
  if override?
    target.public_send(view)
  else
    call(target: target)
  end
end

#resultSymbol

Return result type

This can be either :one or :many

Returns:

API:

  • public



105
106
107
# File 'lib/rom/associations/abstract.rb', line 105

def result
  definition.result
end

#self_ref?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return if this association’s source relation is the same as the target

Returns:

API:

  • private



201
202
203
# File 'lib/rom/associations/abstract.rb', line 201

def self_ref?
  source.name.dataset == target.name.dataset
end

#viewSymbol

Return the name of a custom relation view that should be use to extend or override default association view

Returns:

API:

  • public



85
86
87
# File 'lib/rom/associations/abstract.rb', line 85

def view
  definition.view
end

#wrapRelation

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return target relation as a wrap node

Returns:

API:

  • private



175
176
177
178
179
180
181
# File 'lib/rom/associations/abstract.rb', line 175

def wrap
  target.with(
    name: target.name.as(key),
    schema: target.schema.wrap,
    meta: { wrap: true, combine_name: key }
  )
end