/
binding.rb
84 lines (78 loc) · 2.68 KB
/
binding.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# frozen_string_literal: true
# rubocop:todo all
module Mongoid
module Association
module Referenced
class BelongsTo
# Binding class for belongs_to associations.
class Binding
include Bindable
# Binds the base object to the inverse of the association. This is so we
# are referenced to the actual objects themselves on both sides.
#
# This case sets the association on the inverse object as well as the
# document itself.
#
# @example Bind the documents.
# game.person.bind(:continue => true)
# game.person = Person.new
def bind_one
binding do
check_polymorphic_inverses!(_target)
bind_foreign_key(_base, record_id(_target))
bind_polymorphic_inverse_type(_base, _target.class.name)
if inverse = _association.inverse(_target)
if set_base_association
if _base.referenced_many?
_target.__send__(inverse).push(_base)
else
remove_associated(_target)
_target.set_relation(inverse, _base)
end
end
end
end
end
# Unbinds the base object and the inverse, caused by setting the
# reference to nil.
#
# @example Unbind the document.
# game.person.unbind(:continue => true)
# game.person = nil
def unbind_one
binding do
inverse = _association.inverse(_target)
bind_foreign_key(_base, nil)
bind_polymorphic_inverse_type(_base, nil)
if inverse
set_base_association
if _base.referenced_many?
_target.__send__(inverse).delete(_base)
else
_target.set_relation(inverse, nil)
end
end
end
end
private
# Check for problems with multiple inverse definitions.
#
# @api private
#
# @example Check for inverses errors.
# binding.check_inverses!(doc)
#
# @param [ Document ] doc The document to check.
def check_polymorphic_inverses!(doc)
inverses = _association.inverses(doc)
if inverses.length > 1 && _base.send(_association.foreign_key).nil?
raise Errors::InvalidSetPolymorphicRelation.new(
_association.name, _base.class.name, _target.class.name
)
end
end
end
end
end
end
end