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

Instance Attribute Details

#aliasSymbol (readonly)

Returns An optional association alias.

Returns:

  • (Symbol)

    An optional association alias


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

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


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

option :combine_keys, optional: true

#foreign_keySymbol (readonly)

Returns an optional association alias name.

Returns:

  • (Symbol)

    an optional association alias name


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

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

#nameSymbol (readonly)

Returns The name of an association.

Returns:

  • (Symbol)

    The name of an association


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

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


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

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


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

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

#resultSymbol (readonly)

Returns either :one or :many.

Returns:

  • (Symbol)

    either :one or :many


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

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

#sourceRelation::Name (readonly)

Returns the source relation name.

Returns:


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

param :source

#targetRelation::Name (readonly)

Returns the target relation name.

Returns:


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

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


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

option :view, optional: true

Class Method Details

.new(source, target, **opts) ⇒ 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)

    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


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

def self.new(source, target, **opts)
  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.


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rom/associations/definitions/abstract.rb', line 94

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

  if through
    options[:through] = ThroughIdentifier[
      through,
      target.relation,
      options[:assoc],
      inflector: options.fetch(:inflector, Inflector)
    ]
  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.


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

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)

125
126
127
# File 'lib/rom/associations/definitions/abstract.rb', line 125

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)

116
117
118
# File 'lib/rom/associations/definitions/abstract.rb', line 116

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

#typeClass

Return association class for a given definition object

Returns:

  • (Class)

134
135
136
# File 'lib/rom/associations/definitions/abstract.rb', line 134

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