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



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

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



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

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

#nameSymbol (readonly)

Returns The name of an association.

Returns:

  • (Symbol)

    The name of an association



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

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, default: -> { false }

#relationSymbol (readonly)

Returns an optional relation identifier for the target.

Returns:

  • (Symbol)

    an optional relation identifier for the target



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

option :relation, Types::Strict::Symbol, default: -> { name }

#resultSymbol (readonly)

Returns either :one or :many.

Returns:

  • (Symbol)

    either :one or :many



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

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, opts.to_h)

  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)


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

def aliased?
  !options[:as].nil?
end

#idObject



112
113
114
# File 'lib/rom/associations/definitions/abstract.rb', line 112

def id
  aliased? ? as : name
end

#override?Boolean

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

Returns:

  • (Boolean)


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

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

#to_hObject



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

def to_h
  {id: id, **options}
end

#typeClass

Return association class for a given definition object

Returns:

  • (Class)


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

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