mongoid 6.0.0 → 6.0.1
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
- checksums.yaml.gz.sig +1 -2
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +1 -4
- data/lib/mongoid/attributes.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +2 -6
- data/lib/mongoid/contextual/mongo.rb +21 -17
- data/lib/mongoid/copyable.rb +1 -1
- data/lib/mongoid/criteria/includable.rb +14 -61
- data/lib/mongoid/criteria/queryable/selector.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +10 -1
- data/lib/mongoid/relations/counter_cache.rb +3 -3
- data/lib/mongoid/relations/eager.rb +7 -19
- data/lib/mongoid/version.rb +1 -1
- data/spec/app/models/church.rb +2 -0
- data/spec/app/models/post.rb +1 -0
- data/spec/app/models/post_genre.rb +6 -0
- data/spec/mongoid/attributes_spec.rb +12 -5
- data/spec/mongoid/copyable_spec.rb +7 -2
- data/spec/mongoid/criteria/queryable/selector_spec.rb +45 -0
- data/spec/mongoid/criteria_spec.rb +27 -25
- data/spec/mongoid/persistable/settable_spec.rb +112 -0
- data/spec/mongoid/relations/counter_cache_spec.rb +12 -0
- metadata +4 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed08df05221cb2fd51ee6873d0057b4966a5c0b8
|
4
|
+
data.tar.gz: a741c71fcb479876d2ea795cecb20662732a2333
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cae8bddd78b2ede9c0a8ace4ce8c468699e2a9f3b4377b3af9dde6948a83d911271e5425944ff12a385a56f4c3316f360a313933db558e801b76cb1b23ecd47
|
7
|
+
data.tar.gz: 4611925c73babd6ec1b7b3297e764f78ecd3b49d8dea449dc43d45385151ca59b69dba0f8b454cd554583c4d5217fd1c24f83d7a16cddfd32e1e82611e7c0a95
|
checksums.yaml.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
X���Vlܲ:��Ut�$KlY�=߽�r�zc��8Bu�N�Jd�2?�1�v�+��t�g�ӽ�w���Κ ���=$9��>�����=���ΝU��5ܩ`6C���Bx�j�Bzp�<�6^G{�2�#[����&�^��O� )b�zx�T��K\Hy�����V�a��S ZUT7���H�Д,���,dW�ƴ�{W�����8mI���1&
|
2
1
|
X�B�߁]c��
|
3
|
-
��
|
2
|
+
Wǻ�fJw������ �<L�����ڐ�5��>�������1R9$�nPK)�M#����v��GM��q�?��S��j��YJA����{_�������%45f-{Hy�;BO�_M�$,��@S*i�HI}�З�����]���Dd~1���@��;����j}�����la���]~0��ob8-�����t�_h�:��f�jF��J��̀�R���T8)�w
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/config/locales/en.yml
CHANGED
@@ -115,10 +115,7 @@ en:
|
|
115
115
|
invalid_includes:
|
116
116
|
message: "Invalid includes directive: %{klass}.includes(%{args})"
|
117
117
|
summary: "Eager loading in Mongoid only supports providing arguments
|
118
|
-
to %{klass}.includes that are the names of relations on the %{klass}
|
119
|
-
model, and only supports one level of eager loading. (ie, eager loading
|
120
|
-
associations not on the %{klass} but one step away via another relation
|
121
|
-
is not allowed."
|
118
|
+
to %{klass}.includes that are the names of relations on the %{klass}."
|
122
119
|
resolution: "Ensure that each parameter passed to %{klass}.includes is
|
123
120
|
a valid name of a relation on the %{klass} model. These are: %{relations}."
|
124
121
|
invalid_index:
|
data/lib/mongoid/attributes.rb
CHANGED
@@ -130,9 +130,7 @@ module Mongoid
|
|
130
130
|
#
|
131
131
|
# @since 3.0.0
|
132
132
|
def first
|
133
|
-
|
134
|
-
eager_load_one(doc)
|
135
|
-
doc
|
133
|
+
eager_load([documents.first]).first
|
136
134
|
end
|
137
135
|
alias :one :first
|
138
136
|
alias :find_first :first
|
@@ -165,9 +163,7 @@ module Mongoid
|
|
165
163
|
#
|
166
164
|
# @since 3.0.0
|
167
165
|
def last
|
168
|
-
|
169
|
-
eager_load_one(doc)
|
170
|
-
doc
|
166
|
+
eager_load([documents.last]).first
|
171
167
|
end
|
172
168
|
|
173
169
|
# Get the length of matching documents in the context.
|
@@ -245,9 +245,15 @@ module Mongoid
|
|
245
245
|
return documents.first if cached? && cache_loaded?
|
246
246
|
try_cache(:first) do
|
247
247
|
if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
|
248
|
-
|
248
|
+
if raw_doc = view.sort(sort).limit(-1).first
|
249
|
+
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
250
|
+
eager_load([doc]).first
|
251
|
+
end
|
249
252
|
else
|
250
|
-
|
253
|
+
if raw_doc = view.limit(-1).first
|
254
|
+
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
255
|
+
eager_load([doc]).first
|
256
|
+
end
|
251
257
|
end
|
252
258
|
end
|
253
259
|
end
|
@@ -260,7 +266,10 @@ module Mongoid
|
|
260
266
|
# @since 4.0.2
|
261
267
|
def find_first
|
262
268
|
return documents.first if cached? && cache_loaded?
|
263
|
-
|
269
|
+
if raw_doc = view.first
|
270
|
+
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
271
|
+
eager_load([doc]).first
|
272
|
+
end
|
264
273
|
end
|
265
274
|
|
266
275
|
# Execute a $geoNear command against the database.
|
@@ -348,7 +357,10 @@ module Mongoid
|
|
348
357
|
def last(opts = {})
|
349
358
|
try_cache(:last) do
|
350
359
|
with_inverse_sorting(opts) do
|
351
|
-
|
360
|
+
if raw_doc = view.limit(-1).first
|
361
|
+
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
362
|
+
eager_load([doc]).first
|
363
|
+
end
|
352
364
|
end
|
353
365
|
end
|
354
366
|
end
|
@@ -657,15 +669,9 @@ module Mongoid
|
|
657
669
|
#
|
658
670
|
# @since 3.0.0
|
659
671
|
def documents_for_iteration
|
660
|
-
if cached? && !documents.empty?
|
661
|
-
|
662
|
-
|
663
|
-
docs = view.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
|
664
|
-
eager_load(docs)
|
665
|
-
docs
|
666
|
-
else
|
667
|
-
view
|
668
|
-
end
|
672
|
+
return documents if cached? && !documents.empty?
|
673
|
+
docs = view.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
|
674
|
+
eager_load(docs)
|
669
675
|
end
|
670
676
|
|
671
677
|
# Yield to the document.
|
@@ -681,10 +687,8 @@ module Mongoid
|
|
681
687
|
#
|
682
688
|
# @since 3.0.0
|
683
689
|
def yield_document(document, &block)
|
684
|
-
|
685
|
-
|
686
|
-
yield(doc)
|
687
|
-
documents.push(doc) if cacheable?
|
690
|
+
yield(document)
|
691
|
+
documents.push(document) if cacheable?
|
688
692
|
end
|
689
693
|
end
|
690
694
|
end
|
data/lib/mongoid/copyable.rb
CHANGED
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
attrs = clone_document.except("_id", "id")
|
25
25
|
dynamic_attrs = {}
|
26
26
|
attrs.reject! do |attr_name, value|
|
27
|
-
dynamic_attrs
|
27
|
+
dynamic_attrs.merge!(attr_name => value) unless self.attribute_names.include?(attr_name)
|
28
28
|
end
|
29
29
|
self.class.new(attrs).tap do |object|
|
30
30
|
dynamic_attrs.each do |attr_name, value|
|
@@ -27,13 +27,7 @@ module Mongoid
|
|
27
27
|
#
|
28
28
|
# @since 2.2.0
|
29
29
|
def includes(*relations)
|
30
|
-
relations
|
31
|
-
if relation.is_a?(Hash)
|
32
|
-
extract_nested_inclusion(klass, relation)
|
33
|
-
else
|
34
|
-
add_inclusion(klass, relation)
|
35
|
-
end
|
36
|
-
end
|
30
|
+
extract_includes_list(klass, relations)
|
37
31
|
clone
|
38
32
|
end
|
39
33
|
|
@@ -76,67 +70,26 @@ module Mongoid
|
|
76
70
|
# @raise [ Errors::InvalidIncludes ] If no relation is found.
|
77
71
|
#
|
78
72
|
# @since 5.1.0
|
79
|
-
def add_inclusion(_klass,
|
80
|
-
metadata = get_inclusion_metadata(_klass, relation)
|
81
|
-
raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless metadata
|
73
|
+
def add_inclusion(_klass, metadata)
|
82
74
|
inclusions.push(metadata) unless inclusions.include?(metadata)
|
83
75
|
end
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
def extract_relations_list(association, relations)
|
95
|
-
relations.each do |relation|
|
96
|
-
if relation.is_a?(Hash)
|
97
|
-
extract_nested_inclusion(association, relation)
|
77
|
+
def extract_includes_list(_parent_class, *relations_list)
|
78
|
+
relations_list.flatten.each do |relation_object|
|
79
|
+
if relation_object.is_a?(Hash)
|
80
|
+
relation_object.each do |relation, _includes|
|
81
|
+
metadata = _parent_class.reflect_on_association(relation)
|
82
|
+
raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless metadata
|
83
|
+
add_inclusion(_parent_class, metadata)
|
84
|
+
extract_includes_list(metadata.klass, _includes)
|
85
|
+
end
|
98
86
|
else
|
99
|
-
|
87
|
+
metadata = _parent_class.reflect_on_association(relation_object)
|
88
|
+
raise Errors::InvalidIncludes.new(_parent_class, [ relation_object ]) unless metadata
|
89
|
+
add_inclusion(_parent_class, metadata)
|
100
90
|
end
|
101
91
|
end
|
102
92
|
end
|
103
|
-
|
104
|
-
# Extract nested inclusion.
|
105
|
-
#
|
106
|
-
# @example Extract the inclusions from a nested definition.
|
107
|
-
# criteria.extract_nested_inclusion(User, { :posts => [:alerts] })
|
108
|
-
#
|
109
|
-
# @param [ Class, Symbol ] _klass The class for which the inclusion should be added.
|
110
|
-
# @param [ Hash ] relation The nested inclusion.
|
111
|
-
#
|
112
|
-
# @since 5.1.0
|
113
|
-
def extract_nested_inclusion(_klass, relation)
|
114
|
-
relation.each do |association, _inclusion|
|
115
|
-
add_inclusion(_klass, association)
|
116
|
-
if _inclusion.is_a?(Array)
|
117
|
-
extract_relations_list(association, _inclusion)
|
118
|
-
else
|
119
|
-
add_inclusion(association, _inclusion)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
# Get the metadata for an inclusion.
|
125
|
-
#
|
126
|
-
# @example Get the metadata for an inclusion definition.
|
127
|
-
# criteria.get_inclusion_metadata(User, :posts)
|
128
|
-
#
|
129
|
-
# @param [ Class, Symbol, String ] _klass The class for determining the association metadata
|
130
|
-
# @param [ Symbol ] association The name of the association.
|
131
|
-
#
|
132
|
-
# @since 5.1.0
|
133
|
-
def get_inclusion_metadata(_klass, association)
|
134
|
-
if _klass.is_a?(Class)
|
135
|
-
_klass.reflect_on_association(association)
|
136
|
-
else
|
137
|
-
_klass.to_s.classify.constantize.reflect_on_association(association)
|
138
|
-
end
|
139
|
-
end
|
140
93
|
end
|
141
94
|
end
|
142
95
|
end
|
@@ -21,7 +21,7 @@ module Mongoid
|
|
21
21
|
other.each_pair do |key, value|
|
22
22
|
if value.is_a?(Hash) && self[key.to_s].is_a?(Hash)
|
23
23
|
value = self[key.to_s].merge(value) do |_key, old_val, new_val|
|
24
|
-
|
24
|
+
_key == '$in' ? new_val & old_val : old_val | new_val
|
25
25
|
end
|
26
26
|
end
|
27
27
|
if multi_selection?(key)
|
@@ -22,7 +22,16 @@ module Mongoid
|
|
22
22
|
def set(setters)
|
23
23
|
prepare_atomic_operation do |ops|
|
24
24
|
process_atomic_operations(setters) do |field, value|
|
25
|
-
|
25
|
+
|
26
|
+
field_and_value_hash = hasherizer(field.split('.'), value)
|
27
|
+
field = field_and_value_hash.keys.first.to_s
|
28
|
+
|
29
|
+
if fields[field] && fields[field].type == Hash && attributes.key?(field)
|
30
|
+
process_attribute(field.to_s, attributes[field].merge(field_and_value_hash[field]))
|
31
|
+
else
|
32
|
+
process_attribute(field.to_s, field_and_value_hash[field])
|
33
|
+
end
|
34
|
+
|
26
35
|
unless relations.include?(field.to_s)
|
27
36
|
ops[atomic_attribute_name(field)] = attributes[field]
|
28
37
|
end
|
@@ -107,10 +107,10 @@ module Mongoid
|
|
107
107
|
|
108
108
|
after_update do
|
109
109
|
if record = __send__(name)
|
110
|
-
|
110
|
+
foreign_key = meta.foreign_key
|
111
111
|
|
112
|
-
if attribute_changed?(
|
113
|
-
original, current = attribute_change(
|
112
|
+
if attribute_changed?(foreign_key)
|
113
|
+
original, current = attribute_change(foreign_key)
|
114
114
|
|
115
115
|
unless original.nil?
|
116
116
|
record.class.with(persistence_context) do |_class|
|
@@ -9,28 +9,16 @@ module Mongoid
|
|
9
9
|
module Relations
|
10
10
|
module Eager
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
def with_eager_loading(document)
|
15
|
-
return nil unless document
|
16
|
-
doc = Factory.from_db(klass, document, criteria.options[:fields])
|
17
|
-
eager_load_one(doc)
|
18
|
-
doc
|
19
|
-
end
|
20
|
-
|
21
|
-
def eager_load_one(doc)
|
22
|
-
eager_load([doc])
|
23
|
-
end
|
24
|
-
|
25
|
-
def eager_loadable?(document = nil)
|
26
|
-
return false if criteria.inclusions.empty?
|
27
|
-
!eager_loaded
|
12
|
+
def eager_loadable?
|
13
|
+
!criteria.inclusions.empty?
|
28
14
|
end
|
29
15
|
|
30
16
|
def eager_load(docs)
|
31
|
-
|
32
|
-
|
33
|
-
|
17
|
+
docs.tap do |docs|
|
18
|
+
if eager_loadable?
|
19
|
+
preload(criteria.inclusions, docs)
|
20
|
+
end
|
21
|
+
end
|
34
22
|
end
|
35
23
|
|
36
24
|
def preload(relations, docs)
|
data/lib/mongoid/version.rb
CHANGED
data/spec/app/models/church.rb
CHANGED
data/spec/app/models/post.rb
CHANGED
@@ -11,6 +11,7 @@ class Post
|
|
11
11
|
|
12
12
|
belongs_to :person, counter_cache: true
|
13
13
|
belongs_to :author, foreign_key: :author_id, class_name: "User"
|
14
|
+
belongs_to :post_genre, foreign_key: :genre_id, counter_cache: true
|
14
15
|
has_and_belongs_to_many :tags, before_add: :before_add_tag, after_add: :after_add_tag, before_remove: :before_remove_tag, after_remove: :after_remove_tag
|
15
16
|
has_many :videos, validate: false
|
16
17
|
has_many :roles, validate: false
|
@@ -1772,15 +1772,22 @@ describe Mongoid::Attributes do
|
|
1772
1772
|
|
1773
1773
|
context 'when the attribute is localized' do
|
1774
1774
|
let(:person) do
|
1775
|
-
Person.create
|
1775
|
+
Person.create
|
1776
1776
|
end
|
1777
1777
|
|
1778
|
-
|
1779
|
-
|
1778
|
+
context 'after initialization when the field is nil' do
|
1779
|
+
|
1780
|
+
it 'returns false' do
|
1781
|
+
expect(person.desc?).to be(false)
|
1782
|
+
end
|
1780
1783
|
end
|
1781
1784
|
|
1782
|
-
|
1783
|
-
|
1785
|
+
context 'when setting the field to nil' do
|
1786
|
+
|
1787
|
+
it 'applies the localization when checking the attribute' do
|
1788
|
+
person.desc = nil
|
1789
|
+
expect(person.desc?).to be(false)
|
1790
|
+
end
|
1784
1791
|
end
|
1785
1792
|
|
1786
1793
|
context 'when the field is a boolean' do
|
@@ -61,7 +61,8 @@ describe Mongoid::Copyable do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
before do
|
64
|
-
|
64
|
+
legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
|
65
|
+
Actor.collection.find(_id: actor.id).update_one("$set" => legacy_fields)
|
65
66
|
end
|
66
67
|
|
67
68
|
let(:cloned) do
|
@@ -72,7 +73,11 @@ describe Mongoid::Copyable do
|
|
72
73
|
expect(cloned.attributes['this_is_not_a_field']).to eq(1)
|
73
74
|
end
|
74
75
|
|
75
|
-
it "
|
76
|
+
it "contains legacy attributes that are nil" do
|
77
|
+
expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "copies the known attributes" do
|
76
81
|
expect(cloned.name).to eq('test')
|
77
82
|
end
|
78
83
|
end
|
@@ -70,6 +70,51 @@ describe Mongoid::Criteria::Queryable::Selector do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
context "when selector contains a $in" do
|
74
|
+
|
75
|
+
let(:initial) do
|
76
|
+
{ "$in" => [1, 2] }
|
77
|
+
end
|
78
|
+
|
79
|
+
before do
|
80
|
+
selector["field"] = initial
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when merging in a new $in with an intersecting value" do
|
84
|
+
|
85
|
+
let(:other) do
|
86
|
+
{ "field" => { "$in" => [1] } }
|
87
|
+
end
|
88
|
+
|
89
|
+
before do
|
90
|
+
selector.merge!(other)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "intersects the $in values" do
|
94
|
+
expect(selector).to eq({
|
95
|
+
"field" => { "$in" => [1] }
|
96
|
+
})
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when merging in a new $in with no intersecting values" do
|
101
|
+
|
102
|
+
let(:other) do
|
103
|
+
{ "field" => { "$in" => [3] } }
|
104
|
+
end
|
105
|
+
|
106
|
+
before do
|
107
|
+
selector.merge!(other)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "intersects the $in values" do
|
111
|
+
expect(selector).to eq({
|
112
|
+
"field" => { "$in" => [] }
|
113
|
+
})
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
73
118
|
context "when selector is not nested" do
|
74
119
|
|
75
120
|
before do
|
@@ -1148,6 +1148,29 @@ describe Mongoid::Criteria do
|
|
1148
1148
|
end
|
1149
1149
|
end
|
1150
1150
|
|
1151
|
+
context "when providing one association" do
|
1152
|
+
|
1153
|
+
let!(:user) do
|
1154
|
+
User.create(posts: [ post1 ])
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
let!(:post1) do
|
1158
|
+
Post.create
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
let(:result) do
|
1162
|
+
User.includes(:posts).first
|
1163
|
+
end
|
1164
|
+
|
1165
|
+
it "executes the query" do
|
1166
|
+
expect(result).to eq(user)
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
it "includes the related objects" do
|
1170
|
+
expect(result.posts).to eq([ post1 ])
|
1171
|
+
end
|
1172
|
+
end
|
1173
|
+
|
1151
1174
|
context "when providing a list of associations" do
|
1152
1175
|
|
1153
1176
|
let!(:user) do
|
@@ -1505,13 +1528,6 @@ describe Mongoid::Criteria do
|
|
1505
1528
|
end
|
1506
1529
|
end
|
1507
1530
|
|
1508
|
-
it "does not eager load the first document" do
|
1509
|
-
doc = criteria.first
|
1510
|
-
expect_query(1) do
|
1511
|
-
expect(doc.person).to eq(person)
|
1512
|
-
end
|
1513
|
-
end
|
1514
|
-
|
1515
1531
|
it "returns the last document" do
|
1516
1532
|
expect(document).to eq(post_two)
|
1517
1533
|
end
|
@@ -1567,13 +1583,6 @@ describe Mongoid::Criteria do
|
|
1567
1583
|
end
|
1568
1584
|
end
|
1569
1585
|
|
1570
|
-
it "does not eager load the last document" do
|
1571
|
-
doc = criteria.last
|
1572
|
-
expect_query(1) do
|
1573
|
-
expect(doc.band).to eq(tool)
|
1574
|
-
end
|
1575
|
-
end
|
1576
|
-
|
1577
1586
|
it "returns the document" do
|
1578
1587
|
expect(document).to eq(address_one)
|
1579
1588
|
end
|
@@ -1599,13 +1608,6 @@ describe Mongoid::Criteria do
|
|
1599
1608
|
end
|
1600
1609
|
end
|
1601
1610
|
|
1602
|
-
it "does not eager load the first document" do
|
1603
|
-
doc = criteria.first
|
1604
|
-
expect_query(1) do
|
1605
|
-
expect(doc.band).to eq(depeche)
|
1606
|
-
end
|
1607
|
-
end
|
1608
|
-
|
1609
1611
|
it "returns the document" do
|
1610
1612
|
expect(document).to eq(address_two)
|
1611
1613
|
end
|
@@ -1699,7 +1701,7 @@ describe Mongoid::Criteria do
|
|
1699
1701
|
end
|
1700
1702
|
|
1701
1703
|
before do
|
1702
|
-
expect(new_context).to receive(:
|
1704
|
+
expect(new_context).to receive(:eager_load).with([person]).once.and_call_original
|
1703
1705
|
end
|
1704
1706
|
|
1705
1707
|
let!(:from_db) do
|
@@ -1750,7 +1752,7 @@ describe Mongoid::Criteria do
|
|
1750
1752
|
end
|
1751
1753
|
|
1752
1754
|
before do
|
1753
|
-
expect(context).to receive(:
|
1755
|
+
expect(context).to receive(:eager_load).with([person]).once.and_call_original
|
1754
1756
|
end
|
1755
1757
|
|
1756
1758
|
let!(:from_db) do
|
@@ -2129,7 +2131,7 @@ describe Mongoid::Criteria do
|
|
2129
2131
|
end
|
2130
2132
|
|
2131
2133
|
before do
|
2132
|
-
expect(context).to receive(:
|
2134
|
+
expect(context).to receive(:preload).twice.and_call_original
|
2133
2135
|
end
|
2134
2136
|
|
2135
2137
|
let!(:documents) do
|
@@ -2192,7 +2194,7 @@ describe Mongoid::Criteria do
|
|
2192
2194
|
end
|
2193
2195
|
|
2194
2196
|
before do
|
2195
|
-
expect(context).to receive(:
|
2197
|
+
expect(context).to receive(:preload).twice.and_call_original
|
2196
2198
|
end
|
2197
2199
|
|
2198
2200
|
let!(:documents) do
|
@@ -204,4 +204,116 @@ describe Mongoid::Persistable::Settable do
|
|
204
204
|
expect(agent.reload.title).to eq title
|
205
205
|
end
|
206
206
|
end
|
207
|
+
|
208
|
+
context 'when the field is already set locally' do
|
209
|
+
|
210
|
+
let(:church) do
|
211
|
+
Church.new.tap do |a|
|
212
|
+
a.location = { 'city' => 'Berlin' }
|
213
|
+
a.name = 'Church1'
|
214
|
+
a.save
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'when the field is a Hash type' do
|
219
|
+
|
220
|
+
before do
|
221
|
+
church.set('location.neighborhood' => 'Kreuzberg')
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'updates the hash while keeping existing key and values locally' do
|
225
|
+
expect(church.location).to eq({ 'city' => 'Berlin', 'neighborhood' => 'Kreuzberg'})
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'updates the hash in the database' do
|
229
|
+
expect(church.reload.location).to eq({ 'city' => 'Berlin', 'neighborhood' => 'Kreuzberg'})
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
context 'when the field type is String' do
|
234
|
+
|
235
|
+
before do
|
236
|
+
church.set('name' => 'Church2')
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'updates the field locally' do
|
240
|
+
expect(church.name).to eq('Church2')
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'updates the field in the database' do
|
244
|
+
expect(church.reload.name).to eq('Church2')
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
context 'when there are two fields of type Hash and String' do
|
249
|
+
|
250
|
+
before do
|
251
|
+
church.set('name' => 'Church2', 'location.street' => 'Yorckstr.')
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'updates the fields locally' do
|
255
|
+
expect(church.name).to eq('Church2')
|
256
|
+
expect(church.location).to eq({ 'city' => 'Berlin', 'street' => 'Yorckstr.'})
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'updates the fields in the database' do
|
260
|
+
expect(church.reload.name).to eq('Church2')
|
261
|
+
expect(church.reload.location).to eq({ 'city' => 'Berlin', 'street' => 'Yorckstr.'})
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
context 'when the field is not already set locally' do
|
267
|
+
|
268
|
+
let(:church) do
|
269
|
+
Church.create
|
270
|
+
end
|
271
|
+
|
272
|
+
context 'when the field is a Hash type' do
|
273
|
+
|
274
|
+
before do
|
275
|
+
church.set('location.neighborhood' => 'Kreuzberg')
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'sets the hash locally' do
|
279
|
+
expect(church.location).to eq({ 'neighborhood' => 'Kreuzberg'})
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'sets the hash in the database' do
|
283
|
+
expect(church.reload.location).to eq({ 'neighborhood' => 'Kreuzberg'})
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
context 'when the field type is String' do
|
288
|
+
|
289
|
+
before do
|
290
|
+
church.set('name' => 'Church2')
|
291
|
+
end
|
292
|
+
|
293
|
+
it 'sets the field locally' do
|
294
|
+
expect(church.name).to eq('Church2')
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'sets the field in the database' do
|
298
|
+
expect(church.reload.name).to eq('Church2')
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
context 'when there are two fields of type Hash and String' do
|
303
|
+
|
304
|
+
before do
|
305
|
+
church.set('name' => 'Church2', 'location.street' => 'Yorckstr.')
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'sets the fields locally' do
|
309
|
+
expect(church.name).to eq('Church2')
|
310
|
+
expect(church.location).to eq({ 'street' => 'Yorckstr.'})
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'sets the fields in the database' do
|
314
|
+
expect(church.reload.name).to eq('Church2')
|
315
|
+
expect(church.reload.location).to eq({ 'street' => 'Yorckstr.'})
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
207
319
|
end
|
@@ -412,6 +412,18 @@ describe Mongoid::Relations::CounterCache do
|
|
412
412
|
it "updates the original object's counter cache" do
|
413
413
|
expect(person1.reload.drugs_count).to eq(1)
|
414
414
|
end
|
415
|
+
|
416
|
+
context 'when foreign_key differs from model name' do
|
417
|
+
|
418
|
+
let(:genre) { PostGenre.create }
|
419
|
+
|
420
|
+
let(:post) { Post.create }
|
421
|
+
|
422
|
+
it 'updates correct counter cache' do
|
423
|
+
post.update post_genre: genre
|
424
|
+
expect(genre.reload.posts_count).to eq 1
|
425
|
+
end
|
426
|
+
end
|
415
427
|
end
|
416
428
|
end
|
417
429
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Durran Jordan
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
ZIvvwAhgCjVW5QCi2I1noxXLmtZ3XDawWu8kaGtu8giHXcwL3941m8hvFZ/Wr9Yi
|
31
31
|
JvcXJt2a4/JvwnIs2hmKuyfhZmB9HEE5wQQaCMnnC14=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2016-
|
33
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: activemodel
|
@@ -509,6 +509,7 @@ files:
|
|
509
509
|
- spec/app/models/pizza.rb
|
510
510
|
- spec/app/models/player.rb
|
511
511
|
- spec/app/models/post.rb
|
512
|
+
- spec/app/models/post_genre.rb
|
512
513
|
- spec/app/models/powerup.rb
|
513
514
|
- spec/app/models/preference.rb
|
514
515
|
- spec/app/models/princess.rb
|
@@ -999,6 +1000,7 @@ test_files:
|
|
999
1000
|
- spec/app/models/pizza.rb
|
1000
1001
|
- spec/app/models/player.rb
|
1001
1002
|
- spec/app/models/post.rb
|
1003
|
+
- spec/app/models/post_genre.rb
|
1002
1004
|
- spec/app/models/powerup.rb
|
1003
1005
|
- spec/app/models/preference.rb
|
1004
1006
|
- spec/app/models/princess.rb
|
metadata.gz.sig
CHANGED
Binary file
|