-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Expand file tree
/
Copy pathbinding.rb
More file actions
75 lines (69 loc) · 2.39 KB
/
Copy pathbinding.rb
File metadata and controls
75 lines (69 loc) · 2.39 KB
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
# frozen_string_literal: true
# rubocop:todo all
module Mongoid
module Association
module Embedded
class EmbeddedIn
# The Binding object for embedded_in 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 metadata on the inverse object as well as the
# document itself.
#
# @example Bind the documents.
# name.person.bind(:continue => true)
# name.person = Person.new
def bind_one
binding do
check_polymorphic_inverses!(_target)
_base._association = _association.inverse_association(_target) unless _base._association
_base.parentize(_target)
if _base.embedded_many?
_target.send(_association.inverse(_target)).push(_base)
else
remove_associated(_target)
try_method(_target, _association.inverse_setter(_target), _base)
end
end
end
# Unbinds the base object and the inverse, caused by setting the
# reference to nil.
#
# @example Unbind the document.
# name.person.unbind(:continue => true)
# name.person = nil
def unbind_one
binding do
if _base.embedded_many?
_target.send(_association.inverse(_target)).delete(_base)
else
try_method(_target, _association.inverse_setter(_target), nil)
end
end
end
private
# Check for problems with multiple inverse definitions.
#
# @api private
#
# @example Check for inverses errors.
# binding.check_inverses!(doc)
#
# @param [ Mongoid::Document ] doc The document to check.
def check_polymorphic_inverses!(doc)
if inverses = _association.inverses(doc)
if inverses.length > 1
raise Errors::InvalidSetPolymorphicRelation.new(
_association.name, _base.class.name, _target.class.name
)
end
end
end
end
end
end
end
end