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



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

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



22
23
24
# File 'lib/hanami/model/associations/many_to_many.rb', line 22

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



38
39
40
# File 'lib/hanami/model/associations/many_to_many.rb', line 38

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



26
27
28
# File 'lib/hanami/model/associations/many_to_many.rb', line 26

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



34
35
36
# File 'lib/hanami/model/associations/many_to_many.rb', line 34

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



30
31
32
# File 'lib/hanami/model/associations/many_to_many.rb', line 30

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



42
43
44
# File 'lib/hanami/model/associations/many_to_many.rb', line 42

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



15
16
17
18
# File 'lib/hanami/model/associations/many_to_many.rb', line 15

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



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

def add(*data)
  command(:create, relation(through), use: [:timestamps])
    .call(associate(serialize(data)))
rescue => exception
  raise Hanami::Model::Error.for(exception)
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



66
67
68
# File 'lib/hanami/model/associations/many_to_many.rb', line 66

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



87
88
89
# File 'lib/hanami/model/associations/many_to_many.rb', line 87

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



62
63
64
# File 'lib/hanami/model/associations/many_to_many.rb', line 62

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



58
59
60
# File 'lib/hanami/model/associations/many_to_many.rb', line 58

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.

Since:

  • 1.1.0



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

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



54
55
56
# File 'lib/hanami/model/associations/many_to_many.rb', line 54

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



70
71
72
# File 'lib/hanami/model/associations/many_to_many.rb', line 70

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