Class: ROM::Associations::Definitions::Abstract

Inherits:
Object
  • Object
show all
Extended by:
Dry::Core::ClassAttributes, Initializer
Defined in:
lib/rom/associations/definitions/abstract.rb

Overview

Abstract association definition object

Direct Known Subclasses

ManyToMany, ManyToOne, OneToMany, OneToOne

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Initializer

extended

Instance Attribute Details

#aliasSymbol (readonly)

Returns An optional association alias.

Returns:

  • (Symbol)

    An optional association alias



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

option :as, Types::Strict::Symbol.optional, optional: true

#combine_keysHash<Symbol=>Symbol> (readonly)

Returns Override inferred combine keys.

Returns:

  • (Hash<Symbol=>Symbol>)

    Override inferred combine keys



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

option :combine_keys, optional: true

#foreign_keySymbol (readonly)

Returns an optional association alias name.

Returns:

  • (Symbol)

    an optional association alias name



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

option :foreign_key, Types::Optional::Strict::Symbol, optional: true

#nameSymbol (readonly)

Returns The name of an association.

Returns:

  • (Symbol)

    The name of an association



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

option :name, Types::Strict::Symbol, default: -> { target.to_sym }

#overrideTrueClass, FalseClass (readonly)

Returns Whether custom view should override default one or not.

Returns:

  • (TrueClass, FalseClass)

    Whether custom view should override default one or not



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

option :override, optional: true, default: -> { false }

#relationSymbol (readonly)

Returns an optional relation identifier for the target.

Returns:

  • (Symbol)

    an optional relation identifier for the target



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

option :relation, Types::Strict::Symbol, optional: true

#resultSymbol (readonly)

Returns either :one or :many.

Returns:

  • (Symbol)

    either :one or :many



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

option :result, Types::Strict::Symbol, default: -> { self.class.result }

#sourceRelation::Name (readonly)

Returns the source relation name.

Returns:



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

param :source

#targetRelation::Name (readonly)

Returns the target relation name.

Returns:



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

param :target

#viewSymbol (readonly)

Returns An optional view that should be used to extend assoc relation.

Returns:

  • (Symbol)

    An optional view that should be used to extend assoc relation



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

option :view, optional: true

Class Method Details

.new(source, target, opts = EMPTY_HASH) ⇒ Object

Instantiate a new association definition

Parameters:

  • source (Symbol)

    The name of the source dataset

  • target (Symbol)

    The name of the target dataset

  • opts (Hash) (defaults to: EMPTY_HASH)

    The option hash

Options Hash (opts):

  • :as (Symbol)

    The name of the association (defaults to target)

  • :relation (Symbol)

    The name of the target relation (defaults to target)

  • :foreign_key (Symbol)

    The name of a custom foreign key

  • :view (Symbol)

    The name of a custom relation view on the target’s relation side

  • :override (TrueClass, FalseClass)

    Whether provided :view should override association’s default view



76
77
78
79
80
81
82
# File 'lib/rom/associations/definitions/abstract.rb', line 76

def self.new(source, target, opts = EMPTY_HASH)
  source_name = Relation::Name[source]
  target_name = resolve_target_name(target, opts)
  options = process_options(target_name, Hash[opts])

  super(source_name, target_name, options)
end

.process_options(target, options) ⇒ Object

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.



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rom/associations/definitions/abstract.rb', line 93

def self.process_options(target, options)
  through = options[:through]

  if through
    options[:through] = ThroughIdentifier[through, target.relation, options[:assoc]]
  end

  options[:name] = target.relation

  options
end

.resolve_target_name(target, options) ⇒ Object

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.



85
86
87
88
89
90
# File 'lib/rom/associations/definitions/abstract.rb', line 85

def self.resolve_target_name(target, options)
  dataset = target
  relation = options.fetch(:relation, target)

  Relation::Name[relation, dataset, options[:as]]
end

Instance Method Details

#aliased?Boolean

Return true if association is aliased

Returns:

  • (Boolean)


119
120
121
# File 'lib/rom/associations/definitions/abstract.rb', line 119

def aliased?
  options.key?(:as)
end

#override?Boolean

Return true if association’s default relation view should be overridden by a custom one

Returns:

  • (Boolean)


110
111
112
# File 'lib/rom/associations/definitions/abstract.rb', line 110

def override?
  options[:override].equal?(true)
end

#typeClass

Return association class for a given definition object

Returns:

  • (Class)


128
129
130
# File 'lib/rom/associations/definitions/abstract.rb', line 128

def type
  Inflector.demodulize(self.class.name).to_sym
end