Class: Hanami::Model::Associations::ManyToMany Private

Inherits:
Object
  • Object
show all
Defined in:
lib/hanami/model/associations/many_to_many.rb

Overview

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

Many-To-Many association

Since:

  • 0.7.0

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(repository, source, target, subject, scope = nil) ⇒ ManyToMany

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.

Returns a new instance of ManyToMany.

Since:

  • 0.7.0


42
43
44
45
46
47
48
49
50
# File 'lib/hanami/model/associations/many_to_many.rb', line 42

def initialize(repository, source, target, subject, scope = nil)
  @repository = repository
  @source     = source
  @target     = target
  @subject    = subject.to_hash unless subject.nil?
  @through    = relation(source).associations[target].through.to_sym
  @scope      = scope || _build_scope
  freeze
end

Instance Attribute Details

#repositoryObject (readonly)

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.

Since:

  • 1.1.0


20
21
22
# File 'lib/hanami/model/associations/many_to_many.rb', line 20

def repository
  @repository
end

#scopeObject (readonly)

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.

Since:

  • 1.1.0


36
37
38
# File 'lib/hanami/model/associations/many_to_many.rb', line 36

def scope
  @scope
end

#sourceObject (readonly)

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.

Since:

  • 1.1.0


24
25
26
# File 'lib/hanami/model/associations/many_to_many.rb', line 24

def source
  @source
end

#subjectObject (readonly)

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.

Since:

  • 1.1.0


32
33
34
# File 'lib/hanami/model/associations/many_to_many.rb', line 32

def subject
  @subject
end

#targetObject (readonly)

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.

Since:

  • 1.1.0


28
29
30
# File 'lib/hanami/model/associations/many_to_many.rb', line 28

def target
  @target
end

#throughObject (readonly)

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.

Since:

  • 1.1.0


40
41
42
# File 'lib/hanami/model/associations/many_to_many.rb', line 40

def through
  @through
end

Class Method Details

.schema_type(entity) ⇒ 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.

Since:

  • 0.7.0


13
14
15
16
# File 'lib/hanami/model/associations/many_to_many.rb', line 13

def self.schema_type(entity)
  type = Sql::Types::Schema::AssociationType.new(entity)
  Types::Strict::Array.member(type)
end

Instance Method Details

#add(*data) ⇒ 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.

Return the association table object. Would need an aditional query to return the entity

Since:

  • 1.1.0


76
77
78
79
80
81
# File 'lib/hanami/model/associations/many_to_many.rb', line 76

def add(*data)
  command(:create, relation(through), use: [:timestamps])
    .call(associate(serialize(data)))
rescue => e
  raise Hanami::Model::Error.for(e)
end

#countObject

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.

Since:

  • 0.7.0


64
65
66
# File 'lib/hanami/model/associations/many_to_many.rb', line 64

def count
  scope.count
end

#deleteObject

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.

Since:

  • 1.1.0


85
86
87
# File 'lib/hanami/model/associations/many_to_many.rb', line 85

def delete
  relation(through).where(source_foreign_key => subject.fetch(source_primary_key)).delete
end

#each(&blk) ⇒ 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.

Since:

  • 0.7.0


60
61
62
# File 'lib/hanami/model/associations/many_to_many.rb', line 60

def each(&blk)
  scope.each(&blk)
end

#map(&blk) ⇒ 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.

Since:

  • 0.7.0


56
57
58
# File 'lib/hanami/model/associations/many_to_many.rb', line 56

def map(&blk)
  to_a.map(&blk)
end

#remove(target_id) ⇒ 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.

rubocop:disable Metrics/AbcSize

Since:

  • 1.1.0


92
93
94
95
96
97
98
99
100
101
# File 'lib/hanami/model/associations/many_to_many.rb', line 92

def remove(target_id)
  association_record = relation(through)
                       .where(target_foreign_key => target_id, source_foreign_key => subject.fetch(source_primary_key))
                       .one

  return if association_record.nil?

  ar_id = association_record.public_send relation(through).primary_key
  command(:delete, relation(through)).by_pk(ar_id).call
end

#to_aObject

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.

Since:

  • 0.7.0


52
53
54
# File 'lib/hanami/model/associations/many_to_many.rb', line 52

def to_a
  scope.to_a
end

#where(condition) ⇒ 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.

Since:

  • 0.7.0


68
69
70
# File 'lib/hanami/model/associations/many_to_many.rb', line 68

def where(condition)
  __new__(scope.where(condition))
end