mongoid 7.2.3 → 7.3.0

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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +16 -0
  5. data/lib/config/locales/en.yml +2 -2
  6. data/lib/mongoid/association/accessors.rb +1 -1
  7. data/lib/mongoid/association/constrainable.rb +1 -1
  8. data/lib/mongoid/association/depending.rb +4 -4
  9. data/lib/mongoid/association/embedded/batchable.rb +1 -1
  10. data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
  11. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +10 -3
  12. data/lib/mongoid/association/nested/many.rb +1 -1
  13. data/lib/mongoid/association/nested/one.rb +4 -2
  14. data/lib/mongoid/association/proxy.rb +6 -1
  15. data/lib/mongoid/association/referenced/auto_save.rb +2 -2
  16. data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
  17. data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
  18. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
  19. data/lib/mongoid/attributes.rb +24 -13
  20. data/lib/mongoid/attributes/projector.rb +120 -0
  21. data/lib/mongoid/cacheable.rb +2 -2
  22. data/lib/mongoid/clients.rb +1 -1
  23. data/lib/mongoid/clients/factory.rb +22 -8
  24. data/lib/mongoid/config.rb +19 -2
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
  26. data/lib/mongoid/copyable.rb +1 -1
  27. data/lib/mongoid/criteria.rb +4 -5
  28. data/lib/mongoid/criteria/findable.rb +1 -1
  29. data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
  30. data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  32. data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
  33. data/lib/mongoid/criteria/queryable/selectable.rb +8 -8
  34. data/lib/mongoid/document.rb +1 -15
  35. data/lib/mongoid/errors/delete_restriction.rb +8 -9
  36. data/lib/mongoid/evolvable.rb +1 -1
  37. data/lib/mongoid/extensions/boolean.rb +1 -2
  38. data/lib/mongoid/extensions/false_class.rb +1 -1
  39. data/lib/mongoid/extensions/hash.rb +2 -2
  40. data/lib/mongoid/extensions/true_class.rb +1 -1
  41. data/lib/mongoid/fields.rb +43 -5
  42. data/lib/mongoid/inspectable.rb +1 -1
  43. data/lib/mongoid/matcher.rb +7 -0
  44. data/lib/mongoid/matcher/bits.rb +41 -0
  45. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  46. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  47. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  48. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  49. data/lib/mongoid/matcher/expression.rb +4 -0
  50. data/lib/mongoid/matcher/field_operator.rb +6 -0
  51. data/lib/mongoid/matcher/mod.rb +17 -0
  52. data/lib/mongoid/matcher/type.rb +99 -0
  53. data/lib/mongoid/persistable/deletable.rb +1 -2
  54. data/lib/mongoid/persistable/destroyable.rb +8 -2
  55. data/lib/mongoid/persistable/updatable.rb +27 -2
  56. data/lib/mongoid/query_cache.rb +35 -29
  57. data/lib/mongoid/selectable.rb +5 -7
  58. data/lib/mongoid/shardable.rb +21 -5
  59. data/lib/mongoid/touchable.rb +23 -4
  60. data/lib/mongoid/version.rb +1 -1
  61. data/spec/integration/associations/embeds_many_spec.rb +44 -0
  62. data/spec/integration/associations/has_one_spec.rb +48 -0
  63. data/spec/integration/criteria/date_field_spec.rb +1 -1
  64. data/spec/integration/document_spec.rb +9 -0
  65. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  66. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  67. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  68. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  69. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  70. data/spec/integration/matcher_operator_data/in.yml +16 -0
  71. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  72. data/spec/integration/matcher_operator_data/type.yml +70 -0
  73. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  74. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  75. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  76. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  77. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  78. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  79. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  80. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  81. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  82. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  83. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  84. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  85. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  86. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  87. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  88. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  89. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  90. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  91. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  92. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  93. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  94. data/spec/lite_spec_helper.rb +2 -0
  95. data/spec/mongoid/association/depending_spec.rb +391 -352
  96. data/spec/mongoid/association/nested/one_spec.rb +18 -14
  97. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -8
  98. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
  99. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
  100. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
  101. data/spec/mongoid/association/referenced/has_one_models.rb +8 -0
  102. data/spec/mongoid/atomic/paths_spec.rb +64 -12
  103. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  104. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  105. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  106. data/spec/mongoid/attributes_spec.rb +98 -6
  107. data/spec/mongoid/clients/factory_spec.rb +48 -0
  108. data/spec/mongoid/config_spec.rb +32 -0
  109. data/spec/mongoid/contextual/mongo_spec.rb +2 -2
  110. data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
  111. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
  112. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
  113. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
  114. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +229 -24
  115. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  116. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
  117. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  118. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  119. data/spec/mongoid/criteria_spec.rb +0 -275
  120. data/spec/mongoid/document_spec.rb +13 -13
  121. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  122. data/spec/mongoid/extensions/false_class_spec.rb +1 -1
  123. data/spec/mongoid/extensions/string_spec.rb +5 -5
  124. data/spec/mongoid/extensions/true_class_spec.rb +1 -1
  125. data/spec/mongoid/fields/localized_spec.rb +4 -4
  126. data/spec/mongoid/fields_spec.rb +4 -4
  127. data/spec/mongoid/inspectable_spec.rb +12 -4
  128. data/spec/mongoid/persistable/deletable_spec.rb +175 -1
  129. data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
  130. data/spec/mongoid/persistable/savable_spec.rb +3 -5
  131. data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
  132. data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
  133. data/spec/mongoid/reloadable_spec.rb +18 -1
  134. data/spec/mongoid/shardable_spec.rb +44 -0
  135. data/spec/mongoid/touchable_spec.rb +104 -16
  136. data/spec/mongoid/touchable_spec_models.rb +52 -0
  137. data/spec/mongoid/validatable_spec.rb +1 -1
  138. data/spec/spec_helper.rb +6 -2
  139. data/spec/support/client_registry.rb +9 -0
  140. data/spec/support/models/bolt.rb +8 -0
  141. data/spec/support/models/hole.rb +13 -0
  142. data/spec/support/models/mop.rb +0 -1
  143. data/spec/support/models/nut.rb +8 -0
  144. data/spec/support/models/person.rb +6 -0
  145. data/spec/support/models/sealer.rb +8 -0
  146. data/spec/support/models/shirt.rb +12 -0
  147. data/spec/support/models/spacer.rb +8 -0
  148. data/spec/support/models/threadlocker.rb +8 -0
  149. data/spec/support/models/washer.rb +8 -0
  150. metadata +97 -3
  151. metadata.gz.sig +5 -3
  152. data/spec/support/cluster_config.rb +0 -158
@@ -293,6 +293,8 @@ describe Mongoid::Persistable::Savable do
293
293
  expect(truck.crates[1].volume).to eq 0.8
294
294
  expect(truck.crates[1].toys.size).to eq 0
295
295
 
296
+ # TODO: MONGOID-5026: combine the updates so that there are
297
+ # no conflicts.
296
298
  #expect(truck.atomic_updates[:conflicts]).to eq nil
297
299
 
298
300
  expect { truck.save! }.not_to raise_error
@@ -360,8 +362,6 @@ describe Mongoid::Persistable::Savable do
360
362
 
361
363
  context 'when also updating first embedded top level association' do
362
364
  it 'performs all writes' do
363
- pending 'https://jira.mongodb.org/browse/MONGOID-4982'
364
-
365
365
  truck.crates.first.volume = 2
366
366
  truck.crates.first.toys.build(name: 'Bear')
367
367
  truck.crates.build
@@ -397,8 +397,6 @@ describe Mongoid::Persistable::Savable do
397
397
 
398
398
  context 'when embedded association embeds another association' do
399
399
  it 'persists the new documents' do
400
- pending 'https://jira.mongodb.org/browse/MONGOID-4982'
401
-
402
400
  expect(truck.seats.size).to eq 1
403
401
  expect(truck.seats[0].rating).to eq 1
404
402
 
@@ -409,7 +407,7 @@ describe Mongoid::Persistable::Savable do
409
407
 
410
408
  _truck = Truck.find(truck.id)
411
409
  expect(_truck.seats.size).to eq 2
412
- expect(_truck.seats[0].rating).to eq 1
410
+ expect(_truck.seats[0].rating).to eq 2
413
411
  expect(_truck.seats[0].armrests.length).to eq 1
414
412
  expect(_truck.seats[1].rating).to eq 100
415
413
  end
@@ -32,7 +32,7 @@ describe Mongoid::Persistable::Upsertable do
32
32
  context "when the document is new" do
33
33
 
34
34
  let!(:existing) do
35
- Band.create(name: "Photek")
35
+ Band.create!(name: "Photek")
36
36
  end
37
37
 
38
38
  context "when a matching document exists in the db" do
@@ -58,4 +58,12 @@ describe Mongoid::QueryCache::Middleware do
58
58
  end
59
59
  end
60
60
  end
61
+
62
+ context 'when driver implements query cache middleware' do
63
+ min_driver_version '2.15'
64
+
65
+ it 'uses the driver query cache middleware' do
66
+ Mongoid::QueryCache::Middleware.should be Mongo::QueryCache::Middleware
67
+ end
68
+ end
61
69
  end
@@ -110,7 +110,7 @@ describe Mongoid::Reloadable do
110
110
 
111
111
  context "when document not saved" do
112
112
 
113
- context "when raising not found error" do
113
+ context "when there is no document matching our id" do
114
114
 
115
115
  it "raises an error" do
116
116
  expect {
@@ -118,6 +118,23 @@ describe Mongoid::Reloadable do
118
118
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
119
119
  end
120
120
  end
121
+
122
+ context 'when there is a document matching our id' do
123
+
124
+ let!(:previous) { Agent.create!(title: '007') }
125
+
126
+ let(:agent) { Agent.new(id: previous.id) }
127
+
128
+ it 'loads the existing document' do
129
+ agent.title.should be nil
130
+
131
+ lambda do
132
+ agent.reload
133
+ end.should_not raise_error
134
+
135
+ agent.title.should == '007'
136
+ end
137
+ end
121
138
  end
122
139
 
123
140
  context "when the document is embedded" do
@@ -128,6 +128,50 @@ describe Mongoid::Shardable do
128
128
  end
129
129
  end
130
130
 
131
+ context 'when record is persisted' do
132
+ let(:instance) { klass.create(name: value) }
133
+
134
+ it { is_expected.to eq({ 'name' => value }) }
135
+
136
+ context 'changing shard key value' do
137
+ let(:new_value) { 'a-new-value' }
138
+
139
+ before do
140
+ instance.name = new_value
141
+ end
142
+
143
+ it 'uses the newly set shard key value' do
144
+ subject.should == { 'name' => new_value }
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ describe '#shard_key_selector_in_db' do
151
+ subject { instance.shard_key_selector_in_db }
152
+ let(:klass) { Band }
153
+ let(:value) { 'a-brand-name' }
154
+
155
+ before { klass.shard_key(:name) }
156
+
157
+ context 'when record is new' do
158
+ let(:instance) { klass.new(name: value) }
159
+
160
+ it { is_expected.to eq({ 'name' => value }) }
161
+
162
+ context 'changing shard key value' do
163
+ let(:new_value) { 'a-new-value' }
164
+
165
+ before do
166
+ instance.name = new_value
167
+ end
168
+
169
+ it 'uses the existing shard key value' do
170
+ subject.should == { 'name' => new_value }
171
+ end
172
+ end
173
+ end
174
+
131
175
  context 'when record is persisted' do
132
176
  let(:instance) { klass.create(name: value) }
133
177
 
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require "spec_helper"
5
+ require_relative './touchable_spec_models'
5
6
 
6
7
  describe Mongoid::Touchable do
7
8
 
@@ -9,7 +10,7 @@ describe Mongoid::Touchable do
9
10
 
10
11
  context "when the document has no associations" do
11
12
  let(:updatable) do
12
- Updatable.create
13
+ Updatable.create!
13
14
  end
14
15
 
15
16
  it "responds to #touch" do
@@ -28,30 +29,117 @@ describe Mongoid::Touchable do
28
29
  end
29
30
  end
30
31
 
31
- context "when the document is embedded" do
32
+ context 'when the document has a parent association' do
32
33
 
33
- before do
34
- Label.send(:include, Mongoid::Touchable::InstanceMethods)
34
+ let(:building) do
35
+ parent_cls.create!
35
36
  end
36
37
 
37
- let(:band) do
38
- Band.create(name: "Placebo")
38
+ let(:entrance) do
39
+ building.entrances.create!
39
40
  end
40
41
 
41
- let(:label) do
42
- band.create_label(name: "Mute", updated_at: 10.days.ago)
42
+ let(:floor) do
43
+ building.floors.create!
43
44
  end
44
45
 
45
- before do
46
- label.touch
46
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
47
+
48
+ let(:update_time) do
49
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
47
50
  end
48
51
 
49
- it "updates the updated_at timestamp" do
50
- expect(label.updated_at).to be_within(1).of(Time.now)
52
+ after do
53
+ Timecop.return
54
+ end
55
+
56
+ shared_examples 'updates the child' do
57
+ it "updates the updated_at timestamp" do
58
+ entrance
59
+ update_time
60
+ entrance.touch
61
+
62
+ entrance.updated_at.should == update_time
63
+ end
64
+
65
+ it "persists the changes" do
66
+ entrance
67
+ update_time
68
+ entrance.touch
69
+
70
+ entrance.reload.updated_at.should == update_time
71
+ end
51
72
  end
52
73
 
53
- it "persists the changes" do
54
- expect(label.reload.updated_at).to be_within(1).of(Time.now)
74
+ shared_examples 'updates the parent when :touch is true' do
75
+
76
+ it 'updates updated_at on parent' do
77
+ floor
78
+ update_time
79
+ floor.touch
80
+
81
+ building.updated_at.should == update_time
82
+ end
83
+
84
+ it 'persists updated updated_at on parent' do
85
+ floor
86
+ update_time
87
+ floor.touch
88
+
89
+ building.reload.updated_at.should == update_time
90
+ end
91
+ end
92
+
93
+ shared_examples 'updates the parent when :touch is not set' do
94
+ it 'does not update updated_at on parent' do
95
+ entrance
96
+ update_time
97
+ entrance.touch
98
+
99
+ building.updated_at.should == update_time
100
+ end
101
+
102
+ it 'does not persist updated updated_at on parent' do
103
+ entrance
104
+ update_time
105
+ entrance.touch
106
+
107
+ building.reload.updated_at.should == update_time
108
+ end
109
+ end
110
+
111
+ shared_examples 'does not update the parent when :touch is not set' do
112
+ it 'does not update updated_at on parent' do
113
+ entrance
114
+ update_time
115
+ entrance.touch
116
+
117
+ building.updated_at.should == start_time
118
+ end
119
+
120
+ it 'does not persist updated updated_at on parent' do
121
+ entrance
122
+ update_time
123
+ entrance.touch
124
+
125
+ building.reload.updated_at.should == start_time
126
+ end
127
+ end
128
+
129
+ context "when the document is embedded" do
130
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
131
+
132
+ include_examples 'updates the child'
133
+ include_examples 'updates the parent when :touch is true'
134
+ include_examples 'updates the parent when :touch is not set'
135
+ end
136
+
137
+ context "when the document is referenced" do
138
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
139
+
140
+ include_examples 'updates the child'
141
+ include_examples 'updates the parent when :touch is true'
142
+ include_examples 'does not update the parent when :touch is not set'
55
143
  end
56
144
  end
57
145
 
@@ -415,11 +503,11 @@ describe Mongoid::Touchable do
415
503
  context "when modifying the child" do
416
504
 
417
505
  let!(:agency) do
418
- Agency.create
506
+ Agency.create!
419
507
  end
420
508
 
421
509
  let!(:agent) do
422
- agency.agents.create(number: '1')
510
+ agency.agents.create!(number: '1')
423
511
  end
424
512
 
425
513
  it "updates the parent's updated at" do
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module TouchableSpec
5
+ module Embedded
6
+ class Building
7
+ include Mongoid::Document
8
+ include Mongoid::Timestamps
9
+
10
+ embeds_many :entrances
11
+ embeds_many :floors
12
+ end
13
+
14
+ class Entrance
15
+ include Mongoid::Document
16
+ include Mongoid::Timestamps
17
+
18
+ embedded_in :building
19
+ end
20
+
21
+ class Floor
22
+ include Mongoid::Document
23
+ include Mongoid::Timestamps
24
+
25
+ embedded_in :building, touch: true
26
+ end
27
+ end
28
+
29
+ module Referenced
30
+ class Building
31
+ include Mongoid::Document
32
+ include Mongoid::Timestamps
33
+
34
+ has_many :entrances, inverse_of: :building
35
+ has_many :floors, inverse_of: :building
36
+ end
37
+
38
+ class Entrance
39
+ include Mongoid::Document
40
+ include Mongoid::Timestamps
41
+
42
+ belongs_to :building
43
+ end
44
+
45
+ class Floor
46
+ include Mongoid::Document
47
+ include Mongoid::Timestamps
48
+
49
+ belongs_to :building, touch: true
50
+ end
51
+ end
52
+ end
@@ -37,7 +37,7 @@ describe Mongoid::Validatable do
37
37
  end
38
38
 
39
39
  let(:documents) do
40
- Mongoid::Association::Referenced::HasMany::Targets::Enumerable.new([ address ])
40
+ Mongoid::Association::Referenced::HasMany::Enumerable.new([ address ])
41
41
  end
42
42
 
43
43
  before do
data/spec/spec_helper.rb CHANGED
@@ -29,13 +29,17 @@ def database_id_alt
29
29
  "mongoid_test_alt"
30
30
  end
31
31
 
32
+ require 'mrss/cluster_config'
33
+ require 'support/client_registry'
34
+ require 'mrss/constraints'
35
+
36
+ ClusterConfig = Mrss::ClusterConfig
37
+
32
38
  require 'support/authorization'
33
39
  require 'support/expectations'
34
40
  require 'support/helpers'
35
41
  require 'support/macros'
36
- require 'support/cluster_config'
37
42
  require 'support/constraints'
38
- require 'mrss/constraints'
39
43
 
40
44
  # Give MongoDB servers time to start up in CI environments
41
45
  if SpecConfig.instance.ci?
@@ -0,0 +1,9 @@
1
+ require 'singleton'
2
+
3
+ class ClientRegistry
4
+ include Singleton
5
+
6
+ def global_client(name)
7
+ Mongoid.default_client
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class Bolt
5
+ include Mongoid::Document
6
+
7
+ belongs_to :hole
8
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class Hole
5
+ include Mongoid::Document
6
+
7
+ has_one :bolt, dependent: :destroy
8
+ has_one :threadlocker, dependent: :delete_all
9
+ has_one :sealer, dependent: :restrict_with_exception
10
+ has_many :nuts, dependent: :destroy
11
+ has_many :washers, dependent: :delete_all
12
+ has_many :spacers, dependent: :restrict_with_exception
13
+ end
@@ -23,4 +23,3 @@ class Mop
23
23
  field :regexp_field, type: Regexp
24
24
  field :bson_regexp_field, type: BSON::Regexp::Raw
25
25
  end
26
-
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class Nut
5
+ include Mongoid::Document
6
+
7
+ belongs_to :hole
8
+ end
@@ -210,6 +210,12 @@ class Person
210
210
  reset_callbacks(:create)
211
211
  reset_callbacks(:save)
212
212
  reset_callbacks(:destroy)
213
+
214
+ private
215
+
216
+ def secret_name
217
+ "secret"
218
+ end
213
219
  end
214
220
 
215
221
  require "support/models/doctor"