mongoid 9.0.4 → 9.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mongoid/association/eager_loadable.rb +3 -0
- data/lib/mongoid/interceptable.rb +6 -5
- data/lib/mongoid/timestamps/created.rb +8 -1
- data/lib/mongoid/traversable.rb +12 -0
- data/lib/mongoid/validatable/associated.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/spec/mongoid/association/eager_spec.rb +24 -2
- data/spec/mongoid/association_spec.rb +60 -0
- data/spec/mongoid/interceptable_spec.rb +78 -0
- data/spec/mongoid/interceptable_spec_models.rb +39 -115
- data/spec/mongoid/timestamps/created_spec.rb +23 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb0499892233035ab6e0b07f3df4d08dfe7129c1b32830288e9453478b8aba9d
|
4
|
+
data.tar.gz: 5b02bd092e46dfb2aadfa580f3c8b3b4548b82d2e354eba4768ee6c1772eed98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96c1585ccba204b4c316920662aa5e750f3e0dd46a7849ca142d8b42d8b94ba8516c16ae9a194a30dd648937b94ec9247371035ddf951d93ec251eeb06fa15cd
|
7
|
+
data.tar.gz: 057f7cf03935fe694f385f186d74e3468d928f44dac47695ab58319e050ae86c25039083c1bf3debebdf8fdea9025347365b0e341040898cfdf2e09acbf72b31
|
@@ -42,6 +42,9 @@ module Mongoid
|
|
42
42
|
docs_map = {}
|
43
43
|
queue = [ klass.to_s ]
|
44
44
|
|
45
|
+
# account for single-collection inheritance
|
46
|
+
queue.push(klass.root_class.to_s) if klass != klass.root_class
|
47
|
+
|
45
48
|
while klass = queue.shift
|
46
49
|
if as = assoc_map.delete(klass)
|
47
50
|
as.each do |assoc|
|
@@ -152,9 +152,13 @@ module Mongoid
|
|
152
152
|
# @api private
|
153
153
|
def _mongoid_run_child_callbacks(kind, children: nil, &block)
|
154
154
|
if Mongoid::Config.around_callbacks_for_embeds
|
155
|
-
_mongoid_run_child_callbacks_with_around(kind,
|
155
|
+
_mongoid_run_child_callbacks_with_around(kind,
|
156
|
+
children: children,
|
157
|
+
&block)
|
156
158
|
else
|
157
|
-
_mongoid_run_child_callbacks_without_around(kind,
|
159
|
+
_mongoid_run_child_callbacks_without_around(kind,
|
160
|
+
children: children,
|
161
|
+
&block)
|
158
162
|
end
|
159
163
|
end
|
160
164
|
|
@@ -235,9 +239,6 @@ module Mongoid
|
|
235
239
|
return false if env.halted
|
236
240
|
env.value = !env.halted
|
237
241
|
callback_list << [next_sequence, env]
|
238
|
-
if (grandchildren = child.send(:cascadable_children, kind))
|
239
|
-
_mongoid_run_child_before_callbacks(kind, children: grandchildren, callback_list: callback_list)
|
240
|
-
end
|
241
242
|
end
|
242
243
|
callback_list
|
243
244
|
end
|
@@ -23,13 +23,20 @@ module Mongoid
|
|
23
23
|
# @example Set the created at time.
|
24
24
|
# person.set_created_at
|
25
25
|
def set_created_at
|
26
|
-
if
|
26
|
+
if able_to_set_created_at?
|
27
27
|
now = Time.current
|
28
28
|
self.updated_at = now if is_a?(Updated) && !updated_at_changed?
|
29
29
|
self.created_at = now
|
30
30
|
end
|
31
31
|
clear_timeless_option
|
32
32
|
end
|
33
|
+
|
34
|
+
# Is the created timestamp able to be set?
|
35
|
+
#
|
36
|
+
# @return [ true, false ] If the timestamp can be set.
|
37
|
+
def able_to_set_created_at?
|
38
|
+
!frozen? && !timeless? && !created_at
|
39
|
+
end
|
33
40
|
end
|
34
41
|
end
|
35
42
|
end
|
data/lib/mongoid/traversable.rb
CHANGED
@@ -44,6 +44,18 @@ module Mongoid
|
|
44
44
|
!!(superclass < Mongoid::Document)
|
45
45
|
end
|
46
46
|
|
47
|
+
# Returns the root class of the STI tree that the current
|
48
|
+
# class participates in. If the class is not an STI subclass, this
|
49
|
+
# returns the class itself.
|
50
|
+
#
|
51
|
+
# @return [ Mongoid::Document ] the root of the STI tree
|
52
|
+
def root_class
|
53
|
+
root = self
|
54
|
+
root = root.superclass while root.hereditary?
|
55
|
+
|
56
|
+
root
|
57
|
+
end
|
58
|
+
|
47
59
|
# When inheriting, we want to copy the fields from the parent class and
|
48
60
|
# set the on the child to start, mimicking the behavior of the old
|
49
61
|
# class_inheritable_accessor that was deprecated in Rails edge.
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
74
74
|
# use map.all? instead of just all?, because all? will do short-circuit
|
75
75
|
# evaluation and terminate on the first failed validation.
|
76
76
|
list.map do |value|
|
77
|
-
if value && !value.flagged_for_destroy?
|
77
|
+
if value && !value.flagged_for_destroy?
|
78
78
|
value.validated? ? true : value.valid?
|
79
79
|
else
|
80
80
|
true
|
data/lib/mongoid/version.rb
CHANGED
@@ -15,14 +15,36 @@ describe Mongoid::Association::EagerLoadable do
|
|
15
15
|
Mongoid::Contextual::Mongo.new(criteria)
|
16
16
|
end
|
17
17
|
|
18
|
+
let(:association_host) { Account }
|
19
|
+
|
18
20
|
let(:inclusions) do
|
19
21
|
includes.map do |key|
|
20
|
-
|
22
|
+
association_host.reflect_on_association(key)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
let(:doc) { criteria.first }
|
25
27
|
|
28
|
+
context 'when root is an STI subclass' do
|
29
|
+
# Driver has_one Vehicle
|
30
|
+
# Vehicle belongs_to Driver
|
31
|
+
# Truck is a Vehicle
|
32
|
+
|
33
|
+
before do
|
34
|
+
Driver.create!(vehicle: Truck.new)
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:criteria) { Truck.all }
|
38
|
+
let(:includes) { %i[ driver ] }
|
39
|
+
let(:association_host) { Truck }
|
40
|
+
|
41
|
+
it 'preloads the driver' do
|
42
|
+
expect(doc.ivar(:driver)).to be false
|
43
|
+
context.preload(inclusions, [ doc ])
|
44
|
+
expect(doc.ivar(:driver)).to be == Driver.first
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
26
48
|
context "when belongs_to" do
|
27
49
|
|
28
50
|
let!(:account) do
|
@@ -43,7 +65,7 @@ describe Mongoid::Association::EagerLoadable do
|
|
43
65
|
it "preloads the parent" do
|
44
66
|
expect(doc.ivar(:person)).to be false
|
45
67
|
context.preload(inclusions, [doc])
|
46
|
-
expect(doc.ivar(:person)).to
|
68
|
+
expect(doc.ivar(:person)).to be == person
|
47
69
|
end
|
48
70
|
end
|
49
71
|
|
@@ -115,6 +115,66 @@ describe Mongoid::Association do
|
|
115
115
|
expect(name).to_not be_an_embedded_many
|
116
116
|
end
|
117
117
|
end
|
118
|
+
|
119
|
+
context "when validation depends on association" do
|
120
|
+
before(:all) do
|
121
|
+
class Author
|
122
|
+
include Mongoid::Document
|
123
|
+
embeds_many :books, cascade_callbacks: true
|
124
|
+
field :condition, type: Boolean
|
125
|
+
end
|
126
|
+
|
127
|
+
class Book
|
128
|
+
include Mongoid::Document
|
129
|
+
embedded_in :author
|
130
|
+
validate :parent_condition_is_not_true
|
131
|
+
|
132
|
+
def parent_condition_is_not_true
|
133
|
+
return unless author&.condition
|
134
|
+
errors.add :base, "Author condition is true."
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
Author.delete_all
|
139
|
+
Book.delete_all
|
140
|
+
end
|
141
|
+
|
142
|
+
let(:author) { Author.new }
|
143
|
+
let(:book) { Book.new }
|
144
|
+
|
145
|
+
context "when author is not persisted" do
|
146
|
+
it "is valid without books" do
|
147
|
+
expect(author.valid?).to be true
|
148
|
+
end
|
149
|
+
|
150
|
+
it "is valid with a book" do
|
151
|
+
author.books << book
|
152
|
+
expect(author.valid?).to be true
|
153
|
+
end
|
154
|
+
|
155
|
+
it "is not valid when condition is true with a book" do
|
156
|
+
author.condition = true
|
157
|
+
author.books << book
|
158
|
+
expect(author.valid?).to be false
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context "when author is persisted" do
|
163
|
+
before do
|
164
|
+
author.books << book
|
165
|
+
author.save
|
166
|
+
end
|
167
|
+
|
168
|
+
it "remains valid initially" do
|
169
|
+
expect(author.valid?).to be true
|
170
|
+
end
|
171
|
+
|
172
|
+
it "becomes invalid when condition is set to true" do
|
173
|
+
author.update_attributes(condition: true)
|
174
|
+
expect(author.valid?).to be false
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
118
178
|
end
|
119
179
|
|
120
180
|
describe "#embedded_one?" do
|
@@ -389,6 +389,84 @@ describe Mongoid::Interceptable do
|
|
389
389
|
end
|
390
390
|
end
|
391
391
|
end
|
392
|
+
|
393
|
+
context 'with embedded grandchildren' do
|
394
|
+
IS = InterceptableSpec
|
395
|
+
|
396
|
+
context 'when creating' do
|
397
|
+
let(:registry) { IS::CallbackRegistry.new(only: %i[ before_save ]) }
|
398
|
+
|
399
|
+
let(:expected_calls) do
|
400
|
+
[
|
401
|
+
# the parent
|
402
|
+
[ IS::CbParent, :before_save ],
|
403
|
+
|
404
|
+
# the immediate child of the parent
|
405
|
+
[ IS::CbCascadedNode, :before_save ],
|
406
|
+
|
407
|
+
# the grandchild of the parent
|
408
|
+
[ IS::CbCascadedNode, :before_save ],
|
409
|
+
]
|
410
|
+
end
|
411
|
+
|
412
|
+
let!(:parent) do
|
413
|
+
parent = IS::CbParent.new(registry)
|
414
|
+
child = IS::CbCascadedNode.new(registry)
|
415
|
+
grandchild = IS::CbCascadedNode.new(registry)
|
416
|
+
|
417
|
+
child.cb_cascaded_nodes = [ grandchild ]
|
418
|
+
parent.cb_cascaded_nodes = [ child ]
|
419
|
+
|
420
|
+
parent.tap(&:save)
|
421
|
+
end
|
422
|
+
|
423
|
+
it 'should cascade callbacks to grandchildren' do
|
424
|
+
expect(registry.calls).to be == expected_calls
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
context 'when updating' do
|
429
|
+
let(:registry) { IS::CallbackRegistry.new(only: %i[ before_update ]) }
|
430
|
+
|
431
|
+
let(:expected_calls) do
|
432
|
+
[
|
433
|
+
# the parent
|
434
|
+
[ IS::CbParent, :before_update ],
|
435
|
+
|
436
|
+
# the immediate child of the parent
|
437
|
+
[ IS::CbCascadedNode, :before_update ],
|
438
|
+
|
439
|
+
# the grandchild of the parent
|
440
|
+
[ IS::CbCascadedNode, :before_update ],
|
441
|
+
]
|
442
|
+
end
|
443
|
+
|
444
|
+
let!(:parent) do
|
445
|
+
parent = IS::CbParent.new(nil)
|
446
|
+
child = IS::CbCascadedNode.new(nil)
|
447
|
+
grandchild = IS::CbCascadedNode.new(nil)
|
448
|
+
|
449
|
+
child.cb_cascaded_nodes = [ grandchild ]
|
450
|
+
parent.cb_cascaded_nodes = [ child ]
|
451
|
+
|
452
|
+
parent.save
|
453
|
+
|
454
|
+
parent.callback_registry = registry
|
455
|
+
child.callback_registry = registry
|
456
|
+
grandchild.callback_registry = registry
|
457
|
+
|
458
|
+
parent.name = 'updated'
|
459
|
+
child.name = 'updated'
|
460
|
+
grandchild.name = 'updated'
|
461
|
+
|
462
|
+
parent.tap(&:save)
|
463
|
+
end
|
464
|
+
|
465
|
+
it 'should cascade callbacks to grandchildren' do
|
466
|
+
expect(registry.calls).to be == expected_calls
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
392
470
|
end
|
393
471
|
|
394
472
|
describe ".before_destroy" do
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# rubocop:todo all
|
2
2
|
module InterceptableSpec
|
3
3
|
class CallbackRegistry
|
4
|
-
def initialize
|
4
|
+
def initialize(only: [])
|
5
5
|
@calls = []
|
6
|
+
@only = only
|
6
7
|
end
|
7
8
|
|
8
9
|
def record_call(cls, cb)
|
10
|
+
return unless @only.empty? || @only.any? { |pat| pat == cb }
|
9
11
|
@calls << [cls, cb]
|
10
12
|
end
|
11
13
|
|
@@ -16,6 +18,8 @@ module InterceptableSpec
|
|
16
18
|
extend ActiveSupport::Concern
|
17
19
|
|
18
20
|
included do
|
21
|
+
field :name, type: String
|
22
|
+
|
19
23
|
%i(
|
20
24
|
validation save create update
|
21
25
|
).each do |what|
|
@@ -35,199 +39,110 @@ module InterceptableSpec
|
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class CbHasOneParent
|
41
|
-
include Mongoid::Document
|
42
42
|
|
43
|
-
|
43
|
+
attr_accessor :callback_registry
|
44
44
|
|
45
|
-
def initialize(callback_registry)
|
45
|
+
def initialize(callback_registry, *args, **kwargs)
|
46
46
|
@callback_registry = callback_registry
|
47
|
-
super()
|
47
|
+
super(*args, **kwargs)
|
48
48
|
end
|
49
|
+
end
|
49
50
|
|
50
|
-
|
51
|
-
|
51
|
+
module RootInsertable
|
52
52
|
def insert_as_root
|
53
53
|
@callback_registry&.record_call(self.class, :insert_into_database)
|
54
54
|
super
|
55
55
|
end
|
56
|
+
end
|
56
57
|
|
58
|
+
class CbHasOneParent
|
59
|
+
include Mongoid::Document
|
57
60
|
include CallbackTracking
|
61
|
+
include RootInsertable
|
62
|
+
|
63
|
+
has_one :child, autosave: true, class_name: "CbHasOneChild", inverse_of: :parent
|
58
64
|
end
|
59
65
|
|
60
66
|
class CbHasOneChild
|
61
67
|
include Mongoid::Document
|
68
|
+
include CallbackTracking
|
62
69
|
|
63
70
|
belongs_to :parent, class_name: "CbHasOneParent", inverse_of: :child
|
64
|
-
|
65
|
-
def initialize(callback_registry)
|
66
|
-
@callback_registry = callback_registry
|
67
|
-
super()
|
68
|
-
end
|
69
|
-
|
70
|
-
attr_accessor :callback_registry
|
71
|
-
|
72
|
-
include CallbackTracking
|
73
71
|
end
|
74
72
|
|
75
73
|
class CbHasManyParent
|
76
74
|
include Mongoid::Document
|
75
|
+
include CallbackTracking
|
76
|
+
include RootInsertable
|
77
77
|
|
78
78
|
has_many :children, autosave: true, class_name: "CbHasManyChild", inverse_of: :parent
|
79
|
-
|
80
|
-
def initialize(callback_registry)
|
81
|
-
@callback_registry = callback_registry
|
82
|
-
super()
|
83
|
-
end
|
84
|
-
|
85
|
-
attr_accessor :callback_registry
|
86
|
-
|
87
|
-
def insert_as_root
|
88
|
-
@callback_registry&.record_call(self.class, :insert_into_database)
|
89
|
-
super
|
90
|
-
end
|
91
|
-
|
92
|
-
include CallbackTracking
|
93
79
|
end
|
94
80
|
|
95
81
|
class CbHasManyChild
|
96
82
|
include Mongoid::Document
|
83
|
+
include CallbackTracking
|
97
84
|
|
98
85
|
belongs_to :parent, class_name: "CbHasManyParent", inverse_of: :children
|
99
|
-
|
100
|
-
def initialize(callback_registry)
|
101
|
-
@callback_registry = callback_registry
|
102
|
-
super()
|
103
|
-
end
|
104
|
-
|
105
|
-
attr_accessor :callback_registry
|
106
|
-
|
107
|
-
include CallbackTracking
|
108
86
|
end
|
109
87
|
|
110
88
|
class CbEmbedsOneParent
|
111
89
|
include Mongoid::Document
|
90
|
+
include CallbackTracking
|
91
|
+
include RootInsertable
|
112
92
|
|
113
93
|
field :name
|
114
94
|
|
115
95
|
embeds_one :child, cascade_callbacks: true, class_name: "CbEmbedsOneChild", inverse_of: :parent
|
116
|
-
|
117
|
-
def initialize(callback_registry)
|
118
|
-
@callback_registry = callback_registry
|
119
|
-
super()
|
120
|
-
end
|
121
|
-
|
122
|
-
attr_accessor :callback_registry
|
123
|
-
|
124
|
-
def insert_as_root
|
125
|
-
@callback_registry&.record_call(self.class, :insert_into_database)
|
126
|
-
super
|
127
|
-
end
|
128
|
-
|
129
|
-
include CallbackTracking
|
130
96
|
end
|
131
97
|
|
132
98
|
class CbEmbedsOneChild
|
133
99
|
include Mongoid::Document
|
100
|
+
include CallbackTracking
|
134
101
|
|
135
102
|
field :age
|
136
103
|
|
137
104
|
embedded_in :parent, class_name: "CbEmbedsOneParent", inverse_of: :child
|
138
|
-
|
139
|
-
def initialize(callback_registry)
|
140
|
-
@callback_registry = callback_registry
|
141
|
-
super()
|
142
|
-
end
|
143
|
-
|
144
|
-
attr_accessor :callback_registry
|
145
|
-
|
146
|
-
include CallbackTracking
|
147
105
|
end
|
148
106
|
|
149
107
|
class CbEmbedsManyParent
|
150
108
|
include Mongoid::Document
|
109
|
+
include CallbackTracking
|
110
|
+
include RootInsertable
|
151
111
|
|
152
112
|
embeds_many :children, cascade_callbacks: true, class_name: "CbEmbedsManyChild", inverse_of: :parent
|
153
|
-
|
154
|
-
def initialize(callback_registry)
|
155
|
-
@callback_registry = callback_registry
|
156
|
-
super()
|
157
|
-
end
|
158
|
-
|
159
|
-
attr_accessor :callback_registry
|
160
|
-
|
161
|
-
def insert_as_root
|
162
|
-
@callback_registry&.record_call(self.class, :insert_into_database)
|
163
|
-
super
|
164
|
-
end
|
165
|
-
|
166
|
-
include CallbackTracking
|
167
113
|
end
|
168
114
|
|
169
115
|
class CbEmbedsManyChild
|
170
116
|
include Mongoid::Document
|
117
|
+
include CallbackTracking
|
171
118
|
|
172
119
|
embedded_in :parent, class_name: "CbEmbedsManyParent", inverse_of: :children
|
173
|
-
|
174
|
-
def initialize(callback_registry)
|
175
|
-
@callback_registry = callback_registry
|
176
|
-
super()
|
177
|
-
end
|
178
|
-
|
179
|
-
attr_accessor :callback_registry
|
180
|
-
|
181
|
-
include CallbackTracking
|
182
120
|
end
|
183
121
|
|
184
122
|
class CbParent
|
185
123
|
include Mongoid::Document
|
186
|
-
|
187
|
-
def initialize(callback_registry)
|
188
|
-
@callback_registry = callback_registry
|
189
|
-
super()
|
190
|
-
end
|
191
|
-
|
192
|
-
attr_accessor :callback_registry
|
124
|
+
include CallbackTracking
|
193
125
|
|
194
126
|
embeds_many :cb_children
|
195
127
|
embeds_many :cb_cascaded_children, cascade_callbacks: true
|
196
|
-
|
197
|
-
include CallbackTracking
|
128
|
+
embeds_many :cb_cascaded_nodes, cascade_callbacks: true, as: :parent
|
198
129
|
end
|
199
130
|
|
200
131
|
class CbChild
|
201
132
|
include Mongoid::Document
|
133
|
+
include CallbackTracking
|
202
134
|
|
203
135
|
embedded_in :cb_parent
|
204
|
-
|
205
|
-
def initialize(callback_registry, options)
|
206
|
-
@callback_registry = callback_registry
|
207
|
-
super(options)
|
208
|
-
end
|
209
|
-
|
210
|
-
attr_accessor :callback_registry
|
211
|
-
|
212
|
-
include CallbackTracking
|
213
136
|
end
|
214
137
|
|
215
138
|
class CbCascadedChild
|
216
139
|
include Mongoid::Document
|
140
|
+
include CallbackTracking
|
217
141
|
|
218
142
|
embedded_in :cb_parent
|
219
143
|
|
220
|
-
def initialize(callback_registry, options)
|
221
|
-
@callback_registry = callback_registry
|
222
|
-
super(options)
|
223
|
-
end
|
224
|
-
|
225
|
-
attr_accessor :callback_registry
|
226
|
-
|
227
144
|
before_save :test_mongoid_state
|
228
145
|
|
229
|
-
include CallbackTracking
|
230
|
-
|
231
146
|
private
|
232
147
|
|
233
148
|
# Helps test that cascading child callbacks have access to the Mongoid
|
@@ -238,6 +153,15 @@ module InterceptableSpec
|
|
238
153
|
Mongoid::Threaded.stack('interceptable').push(self)
|
239
154
|
end
|
240
155
|
end
|
156
|
+
|
157
|
+
class CbCascadedNode
|
158
|
+
include Mongoid::Document
|
159
|
+
include CallbackTracking
|
160
|
+
|
161
|
+
embedded_in :parent, polymorphic: true
|
162
|
+
|
163
|
+
embeds_many :cb_cascaded_nodes, cascade_callbacks: true, as: :parent
|
164
|
+
end
|
241
165
|
end
|
242
166
|
|
243
167
|
class InterceptableBand
|
@@ -44,4 +44,27 @@ describe Mongoid::Timestamps::Created do
|
|
44
44
|
expect(quiz.created_at).to be_within(10).of(Time.now.utc)
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
context "when the document is destroyed" do
|
49
|
+
let(:book) do
|
50
|
+
Book.create!
|
51
|
+
end
|
52
|
+
|
53
|
+
before do
|
54
|
+
Cover.before_save do
|
55
|
+
destroy if title == "delete me"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
after do
|
60
|
+
Cover.reset_callbacks(:save)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "does not set the created_at timestamp" do
|
64
|
+
book.covers << Cover.new(title: "delete me")
|
65
|
+
expect {
|
66
|
+
book.save
|
67
|
+
}.not_to raise_error
|
68
|
+
end
|
69
|
+
end
|
47
70
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.0.
|
4
|
+
version: 9.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The MongoDB Ruby Team
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-01-
|
10
|
+
date: 2025-01-30 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: activemodel
|
@@ -1202,7 +1202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1202
1202
|
- !ruby/object:Gem::Version
|
1203
1203
|
version: 1.3.6
|
1204
1204
|
requirements: []
|
1205
|
-
rubygems_version: 3.6.
|
1205
|
+
rubygems_version: 3.6.3
|
1206
1206
|
specification_version: 4
|
1207
1207
|
summary: Elegant Persistence in Ruby for MongoDB.
|
1208
1208
|
test_files:
|