mongo_mapper 0.13.0 → 0.15.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 +5 -5
- data/LICENSE +1 -1
- data/README.md +61 -0
- data/examples/keys.rb +1 -1
- data/examples/modifiers/set.rb +1 -1
- data/examples/querying.rb +1 -1
- data/examples/safe.rb +2 -2
- data/examples/scopes.rb +1 -1
- data/lib/mongo_mapper.rb +7 -0
- data/lib/mongo_mapper/connection.rb +16 -37
- data/lib/mongo_mapper/document.rb +4 -0
- data/lib/mongo_mapper/extensions/array.rb +14 -6
- data/lib/mongo_mapper/extensions/hash.rb +15 -3
- data/lib/mongo_mapper/extensions/object.rb +4 -0
- data/lib/mongo_mapper/extensions/object_id.rb +5 -1
- data/lib/mongo_mapper/extensions/string.rb +13 -5
- data/lib/mongo_mapper/extensions/symbol.rb +18 -0
- data/lib/mongo_mapper/plugins/accessible.rb +15 -5
- data/lib/mongo_mapper/plugins/associations.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/base.rb +27 -14
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +10 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +9 -8
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +12 -11
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +60 -29
- data/lib/mongo_mapper/plugins/associations/in_foreign_array_proxy.rb +136 -0
- data/lib/mongo_mapper/plugins/associations/many_association.rb +4 -2
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
- data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +14 -11
- data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
- data/lib/mongo_mapper/plugins/associations/proxy.rb +36 -29
- data/lib/mongo_mapper/plugins/associations/single_association.rb +5 -4
- data/lib/mongo_mapper/plugins/callbacks.rb +13 -0
- data/lib/mongo_mapper/plugins/counter_cache.rb +97 -0
- data/lib/mongo_mapper/plugins/dirty.rb +29 -37
- data/lib/mongo_mapper/plugins/document.rb +1 -1
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +18 -17
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +2 -1
- data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
- data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
- data/lib/mongo_mapper/plugins/indexes.rb +14 -7
- data/lib/mongo_mapper/plugins/keys.rb +170 -151
- data/lib/mongo_mapper/plugins/keys/key.rb +27 -16
- data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +64 -38
- data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
- data/lib/mongo_mapper/plugins/persistence.rb +13 -8
- data/lib/mongo_mapper/plugins/protected.rb +6 -5
- data/lib/mongo_mapper/plugins/querying.rb +85 -42
- data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +20 -15
- data/lib/mongo_mapper/plugins/rails.rb +1 -0
- data/lib/mongo_mapper/plugins/safe.rb +10 -4
- data/lib/mongo_mapper/plugins/sci.rb +0 -0
- data/lib/mongo_mapper/plugins/scopes.rb +78 -7
- data/lib/mongo_mapper/plugins/stats.rb +17 -0
- data/lib/mongo_mapper/plugins/strong_parameters.rb +26 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +1 -1
- data/lib/mongo_mapper/railtie.rb +4 -3
- data/lib/mongo_mapper/utils.rb +2 -2
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
- data/spec/examples.txt +1717 -0
- data/spec/functional/accessible_spec.rb +19 -13
- data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +13 -13
- data/spec/functional/associations/belongs_to_proxy_spec.rb +36 -20
- data/spec/functional/associations/in_array_proxy_spec.rb +145 -10
- data/spec/functional/associations/in_foreign_array_proxy_spec.rb +321 -0
- data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
- data/spec/functional/associations/many_documents_proxy_spec.rb +85 -14
- data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +13 -13
- data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
- data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
- data/spec/functional/associations/one_as_proxy_spec.rb +10 -10
- data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
- data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
- data/spec/functional/associations/one_proxy_spec.rb +10 -10
- data/spec/functional/associations_spec.rb +3 -3
- data/spec/functional/binary_spec.rb +2 -2
- data/spec/functional/caching_spec.rb +8 -15
- data/spec/functional/callbacks_spec.rb +89 -2
- data/spec/functional/counter_cache_spec.rb +235 -0
- data/spec/functional/dirty_spec.rb +63 -46
- data/spec/functional/document_spec.rb +30 -5
- data/spec/functional/dumpable_spec.rb +1 -1
- data/spec/functional/embedded_document_spec.rb +17 -17
- data/spec/functional/identity_map_spec.rb +29 -16
- data/spec/functional/indexes_spec.rb +19 -18
- data/spec/functional/keys_spec.rb +86 -28
- data/spec/functional/logger_spec.rb +3 -3
- data/spec/functional/modifiers_spec.rb +81 -19
- data/spec/functional/partial_updates_spec.rb +577 -0
- data/spec/functional/protected_spec.rb +14 -14
- data/spec/functional/querying_spec.rb +77 -28
- data/spec/functional/safe_spec.rb +23 -27
- data/spec/functional/sci_spec.rb +9 -9
- data/spec/functional/scopes_spec.rb +235 -2
- data/spec/functional/static_keys_spec.rb +153 -0
- data/spec/functional/stats_spec.rb +86 -0
- data/spec/functional/strong_parameters_spec.rb +49 -0
- data/spec/functional/touch_spec.rb +1 -1
- data/spec/functional/validations_spec.rb +51 -57
- data/spec/quality_spec.rb +51 -0
- data/spec/spec_helper.rb +37 -9
- data/spec/support/matchers.rb +5 -14
- data/spec/unit/associations/base_spec.rb +12 -12
- data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
- data/spec/unit/associations/many_association_spec.rb +2 -2
- data/spec/unit/associations/one_association_spec.rb +2 -2
- data/spec/unit/associations/proxy_spec.rb +19 -20
- data/spec/unit/clone_spec.rb +1 -1
- data/spec/unit/document_spec.rb +8 -8
- data/spec/unit/dynamic_finder_spec.rb +8 -8
- data/spec/unit/embedded_document_spec.rb +18 -19
- data/spec/unit/extensions_spec.rb +41 -17
- data/spec/unit/identity_map_middleware_spec.rb +65 -96
- data/spec/unit/key_spec.rb +28 -26
- data/spec/unit/keys_spec.rb +20 -11
- data/spec/unit/model_generator_spec.rb +0 -0
- data/spec/unit/mongo_mapper_spec.rb +38 -85
- data/spec/unit/rails_spec.rb +5 -0
- data/spec/unit/serialization_spec.rb +1 -1
- data/spec/unit/time_zones_spec.rb +2 -2
- data/spec/unit/validations_spec.rb +46 -33
- metadata +66 -37
- data/README.rdoc +0 -59
- data/lib/mongo_mapper/connections/10gen.rb +0 -0
- data/lib/mongo_mapper/connections/moped.rb +0 -0
- data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
@@ -56,12 +56,13 @@ module MongoMapper
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
private
|
60
|
+
|
61
|
+
def create_association(association)
|
62
|
+
@embedded_associations = nil
|
63
|
+
associations[association.name] = association
|
64
|
+
association.setup(self)
|
65
|
+
end
|
65
66
|
end
|
66
67
|
|
67
68
|
def associations
|
@@ -6,7 +6,7 @@ module MongoMapper
|
|
6
6
|
attr_reader :name, :options, :query_options
|
7
7
|
|
8
8
|
# Options that should not be considered MongoDB query options/criteria
|
9
|
-
AssociationOptions = [:as, :class, :class_name, :dependent, :extend, :foreign_key, :in, :polymorphic, :autosave, :touch]
|
9
|
+
AssociationOptions = [:as, :class, :class_name, :dependent, :extend, :foreign_key, :in, :from, :polymorphic, :autosave, :touch, :counter_cache, :ordered]
|
10
10
|
|
11
11
|
def initialize(name, options={}, &extension)
|
12
12
|
@name, @options, @query_options, @original_options = name.to_sym, {}, {}, options
|
@@ -28,13 +28,17 @@ module MongoMapper
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def as?
|
31
|
-
!!@options[:as]
|
31
|
+
!in_foreign_array? && !!@options[:as]
|
32
32
|
end
|
33
33
|
|
34
34
|
def in_array?
|
35
35
|
!!@options[:in]
|
36
36
|
end
|
37
37
|
|
38
|
+
def in_foreign_array?
|
39
|
+
!!@options[:from]
|
40
|
+
end
|
41
|
+
|
38
42
|
def embeddable?
|
39
43
|
klass.embeddable?
|
40
44
|
end
|
@@ -43,6 +47,14 @@ module MongoMapper
|
|
43
47
|
!!@options[:touch]
|
44
48
|
end
|
45
49
|
|
50
|
+
def counter_cache?
|
51
|
+
!!@options[:counter_cache]
|
52
|
+
end
|
53
|
+
|
54
|
+
def ordered?
|
55
|
+
!!@options[:ordered]
|
56
|
+
end
|
57
|
+
|
46
58
|
def type_key_name
|
47
59
|
"_type"
|
48
60
|
end
|
@@ -72,22 +84,23 @@ module MongoMapper
|
|
72
84
|
def setup(model)
|
73
85
|
end
|
74
86
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
87
|
+
private
|
88
|
+
|
89
|
+
def separate_options_and_conditions
|
90
|
+
@original_options.each_pair do |key, value|
|
91
|
+
if AssociationOptions.include?(key)
|
92
|
+
@options[key] = value
|
93
|
+
else
|
94
|
+
@query_options[key] = value
|
83
95
|
end
|
84
96
|
end
|
97
|
+
end
|
85
98
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
99
|
+
def modularized_extensions(*extensions)
|
100
|
+
extensions.flatten.compact.map do |extension|
|
101
|
+
Proc === extension ? Module.new(&extension) : extension
|
90
102
|
end
|
103
|
+
end
|
91
104
|
end
|
92
105
|
end
|
93
106
|
end
|
@@ -20,6 +20,7 @@ module MongoMapper
|
|
20
20
|
model.key type_key_name, String unless model.key?(type_key_name) if polymorphic?
|
21
21
|
super
|
22
22
|
add_touch_callbacks if touch?
|
23
|
+
add_counter_cache if counter_cache?
|
23
24
|
end
|
24
25
|
|
25
26
|
def autosave?
|
@@ -28,7 +29,7 @@ module MongoMapper
|
|
28
29
|
|
29
30
|
def add_touch_callbacks
|
30
31
|
name = self.name
|
31
|
-
method_name = "belongs_to_touch_after_save_or_destroy_for_#{name}"
|
32
|
+
method_name = :"belongs_to_touch_after_save_or_destroy_for_#{name}"
|
32
33
|
touch = options.fetch(:touch)
|
33
34
|
|
34
35
|
@model.send(:define_method, method_name) do
|
@@ -46,7 +47,15 @@ module MongoMapper
|
|
46
47
|
@model.after_save(method_name)
|
47
48
|
@model.after_touch(method_name)
|
48
49
|
@model.after_destroy(method_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_counter_cache
|
53
|
+
options = {}
|
54
|
+
if @options[:counter_cache] && @options[:counter_cache] != true
|
55
|
+
options[:field] = @options[:counter_cache]
|
56
|
+
end
|
49
57
|
|
58
|
+
@model.counter_cache name, options
|
50
59
|
end
|
51
60
|
end
|
52
61
|
end
|
@@ -19,15 +19,16 @@ module MongoMapper
|
|
19
19
|
@target
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
def find_target
|
24
|
-
return nil if association_class.nil? || proxy_owner[association.foreign_key].nil?
|
25
|
-
association_class.find_by_id(proxy_owner[association.foreign_key])
|
26
|
-
end
|
22
|
+
protected
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
def find_target
|
25
|
+
return nil if association_class.nil? || proxy_owner[association.foreign_key].nil?
|
26
|
+
association_class.find_by_id(proxy_owner[association.foreign_key])
|
27
|
+
end
|
28
|
+
|
29
|
+
def association_class
|
30
|
+
proxy_owner[association.type_key_name] ? proxy_owner[association.type_key_name].constantize : nil
|
31
|
+
end
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
@@ -34,18 +34,19 @@ module MongoMapper
|
|
34
34
|
@target.save(options) if @target
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
def find_target
|
39
|
-
return nil if proxy_owner[association.foreign_key].nil?
|
40
|
-
klass.find_by_id(proxy_owner[association.foreign_key])
|
41
|
-
end
|
37
|
+
protected
|
42
38
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
39
|
+
def find_target
|
40
|
+
return nil if proxy_owner[association.foreign_key].nil?
|
41
|
+
klass.find_by_id(proxy_owner[association.foreign_key])
|
42
|
+
end
|
43
|
+
|
44
|
+
def instantiate_target(instantiator, attrs={}, &block)
|
45
|
+
@target = klass.send(instantiator, attrs, &block)
|
46
|
+
proxy_owner[association.foreign_key] = @target.id
|
47
|
+
loaded
|
48
|
+
@target
|
49
|
+
end
|
49
50
|
end
|
50
51
|
end
|
51
52
|
end
|
@@ -34,10 +34,10 @@ module MongoMapper
|
|
34
34
|
@target.each { |doc| doc.persist(options) } if @target
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
private
|
38
|
+
def assign_references(*docs)
|
39
|
+
docs.each { |doc| doc._parent_document = proxy_owner }
|
40
|
+
end
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -6,11 +6,11 @@ module MongoMapper
|
|
6
6
|
include DynamicQuerying::ClassMethods
|
7
7
|
|
8
8
|
def find(*args)
|
9
|
-
query.find(*scoped_ids(args))
|
9
|
+
order_results(query.find(*scoped_ids(args)))
|
10
10
|
end
|
11
11
|
|
12
12
|
def find!(*args)
|
13
|
-
query.find!(*scoped_ids(args))
|
13
|
+
order_results(query.find!(*scoped_ids(args)))
|
14
14
|
end
|
15
15
|
|
16
16
|
def paginate(options)
|
@@ -20,17 +20,29 @@ module MongoMapper
|
|
20
20
|
|
21
21
|
def all(options={})
|
22
22
|
return [] if ids.blank?
|
23
|
-
query(options).all
|
23
|
+
order_results(query(options).all)
|
24
24
|
end
|
25
25
|
|
26
26
|
def first(options={})
|
27
27
|
return nil if ids.blank?
|
28
|
-
|
28
|
+
|
29
|
+
if ordered?
|
30
|
+
ids = find_ordered_ids(options)
|
31
|
+
find!(ids.first) if ids.any?
|
32
|
+
else
|
33
|
+
query(options).first
|
34
|
+
end
|
29
35
|
end
|
30
36
|
|
31
37
|
def last(options={})
|
32
38
|
return nil if ids.blank?
|
33
|
-
|
39
|
+
|
40
|
+
if ordered?
|
41
|
+
ids = find_ordered_ids(options)
|
42
|
+
find!(ids.last) if ids.any?
|
43
|
+
else
|
44
|
+
query(options).last
|
45
|
+
end
|
34
46
|
end
|
35
47
|
|
36
48
|
def count(options={})
|
@@ -99,35 +111,54 @@ module MongoMapper
|
|
99
111
|
reset
|
100
112
|
end
|
101
113
|
|
102
|
-
|
103
|
-
def query(options={})
|
104
|
-
klass.
|
105
|
-
query(association.query_options).
|
106
|
-
amend(options).
|
107
|
-
amend(criteria)
|
108
|
-
end
|
114
|
+
private
|
109
115
|
|
110
|
-
|
111
|
-
|
112
|
-
|
116
|
+
def query(options={})
|
117
|
+
klass.
|
118
|
+
query(association.query_options).
|
119
|
+
amend(options).
|
120
|
+
amend(criteria)
|
121
|
+
end
|
113
122
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
ids.include?(id)
|
118
|
-
end
|
119
|
-
valid.empty? ? nil : valid
|
120
|
-
end
|
123
|
+
def criteria
|
124
|
+
{:_id => ids}
|
125
|
+
end
|
121
126
|
|
122
|
-
|
123
|
-
|
124
|
-
|
127
|
+
def scoped_ids(args)
|
128
|
+
valid = args.flatten.select do |id|
|
129
|
+
id = ObjectId.to_mongo(id) if klass.using_object_id?
|
130
|
+
ids.include?(id)
|
125
131
|
end
|
132
|
+
valid.empty? ? nil : valid
|
133
|
+
end
|
134
|
+
|
135
|
+
def find_ordered_ids(options={})
|
136
|
+
return ids if options.empty?
|
137
|
+
|
138
|
+
matched_ids = klass.collection.distinct(:_id, query(options).criteria.to_hash)
|
139
|
+
matched_ids.sort_by! { |matched_id| ids.index(matched_id) }
|
140
|
+
end
|
141
|
+
|
142
|
+
def find_target
|
143
|
+
return [] if ids.blank?
|
144
|
+
all
|
145
|
+
end
|
146
|
+
|
147
|
+
def ids
|
148
|
+
proxy_owner[options[:in]]
|
149
|
+
end
|
150
|
+
|
151
|
+
def order_results(objects)
|
152
|
+
return objects if !ordered?
|
153
|
+
return objects unless objects.respond_to?(:to_a) && objects.respond_to?(:sort_by)
|
154
|
+
objects.sort_by { |obj| ids.index(obj.id) }
|
155
|
+
end
|
156
|
+
|
157
|
+
def ordered?
|
158
|
+
association.ordered?
|
159
|
+
end
|
126
160
|
|
127
|
-
def ids
|
128
|
-
proxy_owner[options[:in]]
|
129
|
-
end
|
130
161
|
end
|
131
162
|
end
|
132
163
|
end
|
133
|
-
end
|
164
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Plugins
|
4
|
+
module Associations
|
5
|
+
class InForeignArrayProxy < Collection
|
6
|
+
include DynamicQuerying::ClassMethods
|
7
|
+
|
8
|
+
def find(*args)
|
9
|
+
query.find(*scoped_ids(args))
|
10
|
+
end
|
11
|
+
|
12
|
+
def find!(*args)
|
13
|
+
query.find!(*scoped_ids(args))
|
14
|
+
end
|
15
|
+
|
16
|
+
def paginate(options)
|
17
|
+
query.paginate(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def all(options={})
|
21
|
+
query(options).all
|
22
|
+
end
|
23
|
+
|
24
|
+
def first(options={})
|
25
|
+
query(options).first
|
26
|
+
end
|
27
|
+
|
28
|
+
def last(options={})
|
29
|
+
query(options).last
|
30
|
+
end
|
31
|
+
|
32
|
+
def count(options={})
|
33
|
+
query(options).count
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy_all(options={})
|
37
|
+
all(options).each do |doc|
|
38
|
+
doc.destroy
|
39
|
+
end
|
40
|
+
reset
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete_all(options={})
|
44
|
+
docs = query(options).fields(:_id).all
|
45
|
+
klass.delete(docs.map { |d| d.id })
|
46
|
+
reset
|
47
|
+
end
|
48
|
+
|
49
|
+
def nullify
|
50
|
+
replace([])
|
51
|
+
reset
|
52
|
+
end
|
53
|
+
|
54
|
+
def create(attrs={})
|
55
|
+
doc = klass.create(attrs)
|
56
|
+
if doc.persisted?
|
57
|
+
inverse_association(doc) << proxy_owner
|
58
|
+
doc.save
|
59
|
+
reset
|
60
|
+
end
|
61
|
+
doc
|
62
|
+
end
|
63
|
+
|
64
|
+
def create!(attrs={})
|
65
|
+
doc = klass.create!(attrs)
|
66
|
+
|
67
|
+
if doc.persisted?
|
68
|
+
inverse_association(doc) << proxy_owner
|
69
|
+
doc.save
|
70
|
+
reset
|
71
|
+
end
|
72
|
+
doc
|
73
|
+
end
|
74
|
+
|
75
|
+
def <<(*docs)
|
76
|
+
flatten_deeper(docs).each do |doc|
|
77
|
+
inverse_association(doc) << proxy_owner
|
78
|
+
doc.save
|
79
|
+
end
|
80
|
+
reset
|
81
|
+
end
|
82
|
+
alias_method :push, :<<
|
83
|
+
alias_method :concat, :<<
|
84
|
+
|
85
|
+
def replace(docs)
|
86
|
+
doc_ids = docs.map do |doc|
|
87
|
+
doc.save unless doc.persisted?
|
88
|
+
inverse_association(doc) << proxy_owner
|
89
|
+
doc.save
|
90
|
+
doc.id
|
91
|
+
end
|
92
|
+
|
93
|
+
replace_selector = { options[:from] => proxy_owner.id }
|
94
|
+
unless doc_ids.empty?
|
95
|
+
replace_selector[:_id] = {"$not" => {"$in" => doc_ids}}
|
96
|
+
end
|
97
|
+
|
98
|
+
klass.collection.update_many(replace_selector, {
|
99
|
+
"$pull" => { options[:from] => proxy_owner.id }
|
100
|
+
})
|
101
|
+
|
102
|
+
reset
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def query(options={})
|
108
|
+
klass.query({}.
|
109
|
+
merge(association.query_options).
|
110
|
+
merge(options).
|
111
|
+
merge(criteria))
|
112
|
+
end
|
113
|
+
|
114
|
+
def criteria
|
115
|
+
{options[:from] => proxy_owner.id}
|
116
|
+
end
|
117
|
+
|
118
|
+
def scoped_ids(args)
|
119
|
+
valid = args.flatten.map do |id|
|
120
|
+
id = ObjectId.to_mongo(id) if klass.using_object_id?
|
121
|
+
id
|
122
|
+
end
|
123
|
+
valid.empty? ? nil : valid
|
124
|
+
end
|
125
|
+
|
126
|
+
def find_target
|
127
|
+
all
|
128
|
+
end
|
129
|
+
|
130
|
+
def inverse_association(doc)
|
131
|
+
doc.send(options[:as].to_s.pluralize)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|