mongoid-pre 2.0.0.beta1 → 2.0.0.pre
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.
- data/.watchr +15 -10
- data/HISTORY +342 -0
- data/README.rdoc +8 -1
- data/Rakefile +2 -3
- data/VERSION +1 -1
- data/lib/mongoid/associations/{embedded_in.rb → belongs_to.rb} +4 -4
- data/lib/mongoid/associations/belongs_to_related.rb +9 -6
- data/lib/mongoid/associations/{embeds_many.rb → has_many.rb} +20 -33
- data/lib/mongoid/associations/has_many_related.rb +4 -28
- data/lib/mongoid/associations/{embeds_one.rb → has_one.rb} +6 -6
- data/lib/mongoid/associations/options.rb +6 -1
- data/lib/mongoid/associations.rb +32 -41
- data/lib/mongoid/attributes.rb +6 -13
- data/lib/mongoid/collection.rb +1 -2
- data/lib/mongoid/commands/delete.rb +1 -1
- data/lib/mongoid/commands/delete_all.rb +1 -4
- data/lib/mongoid/commands/destroy.rb +1 -1
- data/lib/mongoid/commands/destroy_all.rb +1 -3
- data/lib/mongoid/commands/save.rb +0 -1
- data/lib/mongoid/commands.rb +13 -2
- data/lib/mongoid/components.rb +1 -6
- data/lib/mongoid/config.rb +1 -5
- data/lib/mongoid/contexts/enumerable.rb +17 -54
- data/lib/mongoid/contexts/mongo.rb +38 -101
- data/lib/mongoid/contexts/paging.rb +2 -2
- data/lib/mongoid/contexts.rb +0 -21
- data/lib/mongoid/criteria.rb +73 -15
- data/lib/mongoid/criterion/inclusion.rb +0 -2
- data/lib/mongoid/criterion/optional.rb +2 -10
- data/lib/mongoid/document.rb +30 -41
- data/lib/mongoid/extensions.rb +0 -15
- data/lib/mongoid/field.rb +7 -20
- data/lib/mongoid/fields.rb +10 -15
- data/lib/mongoid/finders.rb +98 -10
- data/lib/mongoid/identity.rb +2 -8
- data/lib/mongoid/named_scope.rb +0 -2
- data/lib/mongoid/validations/associated.rb +8 -3
- data/lib/mongoid/validations/uniqueness.rb +7 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/versioning.rb +1 -1
- data/lib/mongoid.rb +5 -21
- data/mongoid.gemspec +19 -59
- data/spec/integration/mongoid/associations_spec.rb +3 -42
- data/spec/integration/mongoid/attributes_spec.rb +2 -2
- data/spec/integration/mongoid/commands_spec.rb +13 -27
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -13
- data/spec/integration/mongoid/criteria_spec.rb +3 -50
- data/spec/integration/mongoid/document_spec.rb +5 -72
- data/spec/integration/mongoid/finders_spec.rb +28 -85
- data/spec/models/address.rb +3 -3
- data/spec/models/animal.rb +2 -2
- data/spec/models/country_code.rb +2 -2
- data/spec/models/game.rb +1 -2
- data/spec/models/inheritance.rb +5 -5
- data/spec/models/location.rb +2 -2
- data/spec/models/name.rb +3 -3
- data/spec/models/namespacing.rb +2 -2
- data/spec/models/patient.rb +0 -2
- data/spec/models/person.rb +4 -6
- data/spec/models/pet.rb +3 -3
- data/spec/models/pet_owner.rb +3 -3
- data/spec/models/phone.rb +3 -3
- data/spec/models/post.rb +1 -1
- data/spec/models/translation.rb +2 -2
- data/spec/models/vet_visit.rb +2 -2
- data/spec/spec_helper.rb +2 -2
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -4
- data/spec/unit/mongoid/associations/{embedded_in_spec.rb → belongs_to_spec.rb} +11 -11
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +14 -45
- data/spec/unit/mongoid/associations/{embeds_many_spec.rb → has_many_spec.rb} +34 -79
- data/spec/unit/mongoid/associations/{embeds_one_spec.rb → has_one_spec.rb} +18 -18
- data/spec/unit/mongoid/associations/options_spec.rb +19 -20
- data/spec/unit/mongoid/associations_spec.rb +12 -74
- data/spec/unit/mongoid/attributes_spec.rb +51 -83
- data/spec/unit/mongoid/collection_spec.rb +0 -46
- data/spec/unit/mongoid/commands/delete_all_spec.rb +8 -9
- data/spec/unit/mongoid/commands/delete_spec.rb +3 -6
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +2 -0
- data/spec/unit/mongoid/commands/destroy_spec.rb +3 -10
- data/spec/unit/mongoid/commands_spec.rb +11 -20
- data/spec/unit/mongoid/config_spec.rb +0 -18
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +11 -198
- data/spec/unit/mongoid/contexts/mongo_spec.rb +54 -357
- data/spec/unit/mongoid/criteria_spec.rb +78 -107
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +13 -3
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +19 -25
- data/spec/unit/mongoid/criterion/optional_spec.rb +18 -25
- data/spec/unit/mongoid/document_spec.rb +34 -71
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +3 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +2 -16
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +1 -1
- data/spec/unit/mongoid/field_spec.rb +0 -62
- data/spec/unit/mongoid/fields_spec.rb +0 -33
- data/spec/unit/mongoid/finders_spec.rb +1 -37
- data/spec/unit/mongoid/identity_spec.rb +6 -47
- data/spec/unit/mongoid/named_scope_spec.rb +2 -15
- data/spec/unit/mongoid/scope_spec.rb +1 -1
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +3 -3
- data/spec/unit/mongoid_spec.rb +2 -11
- metadata +14 -64
- data/lib/mongoid/associations/meta_data.rb +0 -28
- data/lib/mongoid/contexts/ids.rb +0 -25
- data/lib/mongoid/deprecation.rb +0 -22
- data/lib/mongoid/dirty.rb +0 -203
- data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
- data/lib/mongoid/extensions/binary/conversions.rb +0 -17
- data/lib/mongoid/extensions/objectid/conversions.rb +0 -15
- data/lib/mongoid/extras.rb +0 -61
- data/lib/mongoid/javascript/functions.yml +0 -37
- data/lib/mongoid/javascript.rb +0 -21
- data/lib/mongoid/observable.rb +0 -30
- data/lib/mongoid/paths.rb +0 -54
- data/lib/mongoid/persistence/command.rb +0 -20
- data/lib/mongoid/persistence/insert.rb +0 -71
- data/lib/mongoid/persistence/update.rb +0 -78
- data/lib/mongoid/persistence.rb +0 -27
- data/lib/mongoid/state.rb +0 -32
- data/spec/integration/mongoid/dirty_spec.rb +0 -70
- data/spec/integration/mongoid/persistence/update_spec.rb +0 -46
- data/spec/models/callbacks.rb +0 -18
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/dirty_spec.rb +0 -286
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/persistence/insert_spec.rb +0 -175
- data/spec/unit/mongoid/persistence/update_spec.rb +0 -148
- data/spec/unit/mongoid/persistence_spec.rb +0 -40
- data/spec/unit/mongoid/state_spec.rb +0 -83
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid #:nodoc:
|
|
3
3
|
module Associations #:nodoc:
|
|
4
|
-
class
|
|
4
|
+
class HasOne #:nodoc:
|
|
5
5
|
include Proxy
|
|
6
6
|
|
|
7
7
|
# Build a new object for the association.
|
|
@@ -46,7 +46,7 @@ module Mongoid #:nodoc:
|
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
class << self
|
|
49
|
-
# Preferred method of instantiating a new +
|
|
49
|
+
# Preferred method of instantiating a new +HasOne+, since nil values
|
|
50
50
|
# will be handled properly.
|
|
51
51
|
#
|
|
52
52
|
# Options:
|
|
@@ -56,7 +56,7 @@ module Mongoid #:nodoc:
|
|
|
56
56
|
#
|
|
57
57
|
# Returns:
|
|
58
58
|
#
|
|
59
|
-
# A new +
|
|
59
|
+
# A new +HasOne+ association proxy.
|
|
60
60
|
def instantiate(document, options)
|
|
61
61
|
attributes = document.raw_attributes[options.name]
|
|
62
62
|
return nil if attributes.blank?
|
|
@@ -65,7 +65,7 @@ module Mongoid #:nodoc:
|
|
|
65
65
|
|
|
66
66
|
# Returns the macro used to create the association.
|
|
67
67
|
def macro
|
|
68
|
-
:
|
|
68
|
+
:has_one
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
# Perform an update of the relationship of the parent and child. This
|
|
@@ -79,11 +79,11 @@ module Mongoid #:nodoc:
|
|
|
79
79
|
#
|
|
80
80
|
# Example:
|
|
81
81
|
#
|
|
82
|
-
# <tt>
|
|
82
|
+
# <tt>HasOne.update({:first_name => "Hank"}, person, options)</tt>
|
|
83
83
|
#
|
|
84
84
|
# Returns:
|
|
85
85
|
#
|
|
86
|
-
# A new +
|
|
86
|
+
# A new +HasOne+ association proxy.
|
|
87
87
|
def update(child, parent, options)
|
|
88
88
|
child.assimilate(parent, options)
|
|
89
89
|
instantiate(parent, options)
|
|
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
|
21
21
|
|
|
22
22
|
# Return the foreign key based off the association name.
|
|
23
23
|
def foreign_key
|
|
24
|
-
|
|
24
|
+
name.to_s.foreign_key
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
# Returns the name of the inverse_of association
|
|
@@ -42,6 +42,11 @@ module Mongoid #:nodoc:
|
|
|
42
42
|
@attributes[:name].to_s
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
+
# Returns the parent foreign key association name.
|
|
46
|
+
def parent_key
|
|
47
|
+
@attributes[:parent_key]
|
|
48
|
+
end
|
|
49
|
+
|
|
45
50
|
# Returns whether or not this association is polymorphic.
|
|
46
51
|
def polymorphic
|
|
47
52
|
@attributes[:polymorphic] == true
|
data/lib/mongoid/associations.rb
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
require "mongoid/associations/proxy"
|
|
3
|
+
require "mongoid/associations/belongs_to"
|
|
3
4
|
require "mongoid/associations/belongs_to_related"
|
|
4
|
-
require "mongoid/associations/
|
|
5
|
-
require "mongoid/associations/embeds_many"
|
|
6
|
-
require "mongoid/associations/embeds_one"
|
|
5
|
+
require "mongoid/associations/has_many"
|
|
7
6
|
require "mongoid/associations/has_many_related"
|
|
7
|
+
require "mongoid/associations/has_one"
|
|
8
8
|
require "mongoid/associations/has_one_related"
|
|
9
|
-
require "mongoid/associations/options"
|
|
10
|
-
require "mongoid/associations/meta_data"
|
|
11
9
|
|
|
12
10
|
module Mongoid # :nodoc:
|
|
13
11
|
module Associations #:nodoc:
|
|
@@ -26,18 +24,17 @@ module Mongoid # :nodoc:
|
|
|
26
24
|
|
|
27
25
|
# Updates all the one-to-many relational associations for the name.
|
|
28
26
|
def update_associations(name)
|
|
29
|
-
send(name).each { |doc| doc.save }
|
|
27
|
+
send(name).each { |doc| doc.save }
|
|
30
28
|
end
|
|
31
29
|
|
|
32
30
|
# Update the one-to-one relational association for the name.
|
|
33
31
|
def update_association(name)
|
|
34
32
|
association = send(name)
|
|
35
|
-
association.save
|
|
33
|
+
association.save unless association.nil?
|
|
36
34
|
end
|
|
37
35
|
end
|
|
38
36
|
|
|
39
37
|
module ClassMethods
|
|
40
|
-
|
|
41
38
|
# Adds the association back to the parent document. This macro is
|
|
42
39
|
# necessary to set the references from the child back to the parent
|
|
43
40
|
# document. If a child does not define this association calling
|
|
@@ -51,20 +48,20 @@ module Mongoid # :nodoc:
|
|
|
51
48
|
#
|
|
52
49
|
# class Person
|
|
53
50
|
# include Mongoid::Document
|
|
54
|
-
#
|
|
51
|
+
# has_many :addresses
|
|
55
52
|
# end
|
|
56
53
|
#
|
|
57
54
|
# class Address
|
|
58
55
|
# include Mongoid::Document
|
|
59
|
-
#
|
|
56
|
+
# belongs_to :person, :inverse_of => :addresses
|
|
60
57
|
# end
|
|
61
|
-
def
|
|
58
|
+
def belongs_to(name, options = {}, &block)
|
|
62
59
|
unless options.has_key?(:inverse_of)
|
|
63
60
|
raise Errors::InvalidOptions.new("Options for belongs_to association must include :inverse_of")
|
|
64
61
|
end
|
|
65
62
|
self.embedded = true
|
|
66
63
|
add_association(
|
|
67
|
-
Associations::
|
|
64
|
+
Associations::BelongsTo,
|
|
68
65
|
Associations::Options.new(
|
|
69
66
|
options.merge(:name => name, :extend => block)
|
|
70
67
|
)
|
|
@@ -86,12 +83,14 @@ module Mongoid # :nodoc:
|
|
|
86
83
|
# end
|
|
87
84
|
#
|
|
88
85
|
def belongs_to_related(name, options = {}, &block)
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
field "#{name.to_s}_id"
|
|
87
|
+
index "#{name.to_s}_id" unless self.embedded
|
|
88
|
+
add_association(
|
|
89
|
+
Associations::BelongsToRelated,
|
|
90
|
+
Associations::Options.new(
|
|
91
|
+
options.merge(:name => name, :extend => block)
|
|
91
92
|
)
|
|
92
|
-
|
|
93
|
-
field(opts.foreign_key, :type => Mongoid.use_object_ids ? Mongo::ObjectID : String)
|
|
94
|
-
index(opts.foreign_key) unless self.embedded
|
|
93
|
+
)
|
|
95
94
|
end
|
|
96
95
|
|
|
97
96
|
# Adds the association from a parent document to its children. The name
|
|
@@ -106,24 +105,22 @@ module Mongoid # :nodoc:
|
|
|
106
105
|
#
|
|
107
106
|
# class Person
|
|
108
107
|
# include Mongoid::Document
|
|
109
|
-
#
|
|
108
|
+
# has_many :addresses
|
|
110
109
|
# end
|
|
111
110
|
#
|
|
112
111
|
# class Address
|
|
113
112
|
# include Mongoid::Document
|
|
114
|
-
#
|
|
113
|
+
# belongs_to :person, :inverse_of => :addresses
|
|
115
114
|
# end
|
|
116
|
-
def
|
|
115
|
+
def has_many(name, options = {}, &block)
|
|
117
116
|
add_association(
|
|
118
|
-
Associations::
|
|
117
|
+
Associations::HasMany,
|
|
119
118
|
Associations::Options.new(
|
|
120
119
|
options.merge(:name => name, :extend => block)
|
|
121
120
|
)
|
|
122
121
|
)
|
|
123
122
|
end
|
|
124
123
|
|
|
125
|
-
alias :embed_many :embeds_many
|
|
126
|
-
|
|
127
124
|
# Adds a relational association from the Document to many Documents in
|
|
128
125
|
# another database or collection.
|
|
129
126
|
#
|
|
@@ -139,9 +136,10 @@ module Mongoid # :nodoc:
|
|
|
139
136
|
# end
|
|
140
137
|
#
|
|
141
138
|
def has_many_related(name, options = {}, &block)
|
|
142
|
-
add_association(
|
|
139
|
+
add_association(
|
|
140
|
+
Associations::HasManyRelated,
|
|
143
141
|
Associations::Options.new(
|
|
144
|
-
options.merge(:name => name, :
|
|
142
|
+
options.merge(:name => name, :parent_key => self.name.foreign_key, :extend => block)
|
|
145
143
|
)
|
|
146
144
|
)
|
|
147
145
|
before_save do |document|
|
|
@@ -161,25 +159,23 @@ module Mongoid # :nodoc:
|
|
|
161
159
|
#
|
|
162
160
|
# class Person
|
|
163
161
|
# include Mongoid::Document
|
|
164
|
-
#
|
|
162
|
+
# has_many :addresses
|
|
165
163
|
# end
|
|
166
164
|
#
|
|
167
|
-
# class
|
|
165
|
+
# class Address
|
|
168
166
|
# include Mongoid::Document
|
|
169
|
-
#
|
|
167
|
+
# belongs_to :person
|
|
170
168
|
# end
|
|
171
|
-
def
|
|
169
|
+
def has_one(name, options = {}, &block)
|
|
172
170
|
opts = Associations::Options.new(
|
|
173
171
|
options.merge(:name => name, :extend => block)
|
|
174
172
|
)
|
|
175
|
-
type = Associations::
|
|
173
|
+
type = Associations::HasOne
|
|
176
174
|
add_association(type, opts)
|
|
177
175
|
add_builder(type, opts)
|
|
178
176
|
add_creator(type, opts)
|
|
179
177
|
end
|
|
180
178
|
|
|
181
|
-
alias :embed_one :embeds_one
|
|
182
|
-
|
|
183
179
|
# Adds a relational association from the Document to one Document in
|
|
184
180
|
# another database or collection.
|
|
185
181
|
#
|
|
@@ -197,7 +193,7 @@ module Mongoid # :nodoc:
|
|
|
197
193
|
add_association(
|
|
198
194
|
Associations::HasOneRelated,
|
|
199
195
|
Associations::Options.new(
|
|
200
|
-
options.merge(:name => name, :
|
|
196
|
+
options.merge(:name => name, :parent_key => self.name.foreign_key, :extend => block)
|
|
201
197
|
)
|
|
202
198
|
)
|
|
203
199
|
before_save do |document|
|
|
@@ -226,7 +222,7 @@ module Mongoid # :nodoc:
|
|
|
226
222
|
# getters for the associations will perform the necessary memoization.
|
|
227
223
|
def add_association(type, options)
|
|
228
224
|
name = options.name.to_s
|
|
229
|
-
associations[name] =
|
|
225
|
+
associations[name] = type
|
|
230
226
|
define_method(name) do
|
|
231
227
|
memoized(name) { type.instantiate(self, options) }
|
|
232
228
|
end
|
|
@@ -240,7 +236,7 @@ module Mongoid # :nodoc:
|
|
|
240
236
|
def add_builder(type, options)
|
|
241
237
|
name = options.name.to_s
|
|
242
238
|
define_method("build_#{name}") do |attrs|
|
|
243
|
-
reset(name) { type.new(self,
|
|
239
|
+
reset(name) { type.new(self, attrs.stringify_keys, options) }
|
|
244
240
|
end
|
|
245
241
|
end
|
|
246
242
|
|
|
@@ -250,14 +246,9 @@ module Mongoid # :nodoc:
|
|
|
250
246
|
name = options.name.to_s
|
|
251
247
|
define_method("create_#{name}") do |attrs|
|
|
252
248
|
document = send("build_#{name}", attrs)
|
|
253
|
-
document.
|
|
249
|
+
document.save; document
|
|
254
250
|
end
|
|
255
251
|
end
|
|
256
|
-
|
|
257
|
-
# Find the foreign key.
|
|
258
|
-
def foreign_key(name, options)
|
|
259
|
-
options[:foreign_key] || name.to_s.foreign_key
|
|
260
|
-
end
|
|
261
252
|
end
|
|
262
253
|
end
|
|
263
254
|
end
|
data/lib/mongoid/attributes.rb
CHANGED
|
@@ -37,11 +37,10 @@ module Mongoid #:nodoc:
|
|
|
37
37
|
(attrs || {}).each_pair do |key, value|
|
|
38
38
|
if set_allowed?(key)
|
|
39
39
|
@attributes[key.to_s] = value
|
|
40
|
-
|
|
41
|
-
send("#{key}=", value)
|
|
40
|
+
else
|
|
41
|
+
send("#{key}=", value) if value
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
|
-
setup_modifications
|
|
45
44
|
end
|
|
46
45
|
|
|
47
46
|
# Read a value from the +Document+ attributes. If the value does not exist
|
|
@@ -102,7 +101,7 @@ module Mongoid #:nodoc:
|
|
|
102
101
|
# there is any.
|
|
103
102
|
def write_attribute(name, value)
|
|
104
103
|
access = name.to_s
|
|
105
|
-
|
|
104
|
+
@attributes[access] = fields[access].set(value)
|
|
106
105
|
notify unless id.blank?
|
|
107
106
|
end
|
|
108
107
|
|
|
@@ -125,7 +124,6 @@ module Mongoid #:nodoc:
|
|
|
125
124
|
identify if id.blank?
|
|
126
125
|
notify
|
|
127
126
|
end
|
|
128
|
-
alias :attributes= :write_attributes
|
|
129
127
|
|
|
130
128
|
protected
|
|
131
129
|
# Return true if dynamic field setting is enabled.
|
|
@@ -144,11 +142,6 @@ module Mongoid #:nodoc:
|
|
|
144
142
|
end
|
|
145
143
|
end
|
|
146
144
|
|
|
147
|
-
# Return true if writing to the given field is allowed
|
|
148
|
-
def write_allowed?(key)
|
|
149
|
-
return true unless fields[key.to_s]
|
|
150
|
-
fields[key.to_s].accessible?
|
|
151
|
-
end
|
|
152
145
|
end
|
|
153
146
|
|
|
154
147
|
module ClassMethods
|
|
@@ -159,8 +152,8 @@ module Mongoid #:nodoc:
|
|
|
159
152
|
#
|
|
160
153
|
# class Person
|
|
161
154
|
# include Mongoid::Document
|
|
162
|
-
#
|
|
163
|
-
#
|
|
155
|
+
# has_one :name
|
|
156
|
+
# has_many :addresses
|
|
164
157
|
#
|
|
165
158
|
# accepts_nested_attributes_for :name, :addresses
|
|
166
159
|
# end
|
|
@@ -172,7 +165,7 @@ module Mongoid #:nodoc:
|
|
|
172
165
|
reject(attrs, options)
|
|
173
166
|
association = send(name)
|
|
174
167
|
if association
|
|
175
|
-
|
|
168
|
+
update(association, true)
|
|
176
169
|
association.nested_build(attrs)
|
|
177
170
|
else
|
|
178
171
|
send("build_#{name}", attrs)
|
data/lib/mongoid/collection.rb
CHANGED
|
@@ -30,8 +30,7 @@ module Mongoid #:nodoc
|
|
|
30
30
|
#
|
|
31
31
|
# Either a +Master+ or +Slaves+ collection.
|
|
32
32
|
def directed(options = {})
|
|
33
|
-
options.delete(:
|
|
34
|
-
enslave = options.delete(:enslave) || @klass.enslaved?
|
|
33
|
+
enslave = options.delete(:enslave)
|
|
35
34
|
enslave ? master_or_slaves : master
|
|
36
35
|
end
|
|
37
36
|
|
|
@@ -14,11 +14,8 @@ module Mongoid #:nodoc:
|
|
|
14
14
|
#
|
|
15
15
|
# <tt>DeleteAll.execute(Person, :conditions => { :field => "value" })</tt>
|
|
16
16
|
def self.execute(klass, params = {})
|
|
17
|
-
safe = Mongoid.persist_in_safe_mode
|
|
18
17
|
collection = klass.collection
|
|
19
|
-
|
|
20
|
-
matching = collection.find(selector).count
|
|
21
|
-
collection.remove(selector, :safe => safe) ? matching : 0
|
|
18
|
+
collection.remove((params[:conditions] || {}).merge(:_type => klass.name))
|
|
22
19
|
end
|
|
23
20
|
end
|
|
24
21
|
end
|
|
@@ -16,9 +16,7 @@ module Mongoid #:nodoc:
|
|
|
16
16
|
def self.execute(klass, params)
|
|
17
17
|
conditions = params[:conditions] || {}
|
|
18
18
|
params[:conditions] = conditions.merge(:_type => klass.name)
|
|
19
|
-
|
|
20
|
-
matching = documents.count
|
|
21
|
-
documents.each { |doc| Destroy.execute(doc) }; matching
|
|
19
|
+
klass.find(:all, params).each { |doc| Destroy.execute(doc) }
|
|
22
20
|
end
|
|
23
21
|
end
|
|
24
22
|
end
|
data/lib/mongoid/commands.rb
CHANGED
|
@@ -55,7 +55,12 @@ module Mongoid #:nodoc:
|
|
|
55
55
|
# Returns: true if validation passes, false if not.
|
|
56
56
|
def save(validate = true)
|
|
57
57
|
save = lambda { Save.execute(self, validate) }
|
|
58
|
-
|
|
58
|
+
begin
|
|
59
|
+
return new_record? ? run_callbacks(:create, &save) : save.call
|
|
60
|
+
rescue Mongo::OperationFailure => e
|
|
61
|
+
errors.add(:mongoid, e.message)
|
|
62
|
+
return false
|
|
63
|
+
end
|
|
59
64
|
end
|
|
60
65
|
|
|
61
66
|
# Save the +Document+, dangerously. Before and after save callbacks will
|
|
@@ -110,7 +115,11 @@ module Mongoid #:nodoc:
|
|
|
110
115
|
# Returns: the +Document+.
|
|
111
116
|
def create(attributes = {})
|
|
112
117
|
document = new(attributes)
|
|
113
|
-
|
|
118
|
+
begin
|
|
119
|
+
Create.execute(document)
|
|
120
|
+
rescue Mongo::OperationFailure => e
|
|
121
|
+
document.errors.add(:mongoid, e.message)
|
|
122
|
+
end
|
|
114
123
|
document
|
|
115
124
|
end
|
|
116
125
|
|
|
@@ -156,6 +165,8 @@ module Mongoid #:nodoc:
|
|
|
156
165
|
def destroy_all(conditions = {})
|
|
157
166
|
DestroyAll.execute(self, conditions)
|
|
158
167
|
end
|
|
168
|
+
|
|
159
169
|
end
|
|
170
|
+
|
|
160
171
|
end
|
|
161
172
|
end
|
data/lib/mongoid/components.rb
CHANGED
|
@@ -12,17 +12,12 @@ module Mongoid #:nodoc
|
|
|
12
12
|
include Mongoid::Attributes
|
|
13
13
|
include Mongoid::Callbacks
|
|
14
14
|
include Mongoid::Commands
|
|
15
|
-
include Mongoid::Dirty
|
|
16
|
-
include Mongoid::Extras
|
|
17
15
|
include Mongoid::Fields
|
|
18
16
|
include Mongoid::Indexes
|
|
19
17
|
include Mongoid::Matchers
|
|
20
18
|
include Mongoid::Memoization
|
|
21
|
-
include Mongoid::Observable
|
|
22
|
-
include Mongoid::Paths
|
|
23
|
-
include Mongoid::Persistence
|
|
24
|
-
include Mongoid::State
|
|
25
19
|
include Mongoid::Validations
|
|
20
|
+
include Observable
|
|
26
21
|
extend ActiveModel::Translation
|
|
27
22
|
extend Mongoid::Finders
|
|
28
23
|
extend Mongoid::NamedScope
|
data/lib/mongoid/config.rb
CHANGED
|
@@ -8,19 +8,15 @@ module Mongoid #:nodoc
|
|
|
8
8
|
:reconnect_time,
|
|
9
9
|
:parameterize_keys,
|
|
10
10
|
:persist_in_safe_mode,
|
|
11
|
-
:
|
|
12
|
-
:raise_not_found_error,
|
|
13
|
-
:use_object_ids
|
|
11
|
+
:raise_not_found_error
|
|
14
12
|
|
|
15
13
|
# Defaults the configuration options to true.
|
|
16
14
|
def initialize
|
|
17
15
|
@allow_dynamic_fields = true
|
|
18
16
|
@parameterize_keys = true
|
|
19
17
|
@persist_in_safe_mode = true
|
|
20
|
-
@persist_types = true
|
|
21
18
|
@raise_not_found_error = true
|
|
22
19
|
@reconnect_time = 3
|
|
23
|
-
@use_object_ids = false
|
|
24
20
|
end
|
|
25
21
|
|
|
26
22
|
# Sets the Mongo::DB master database to be used. If the object trying to me
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
module Mongoid #:nodoc:
|
|
3
3
|
module Contexts #:nodoc:
|
|
4
4
|
class Enumerable
|
|
5
|
-
include
|
|
6
|
-
attr_reader :
|
|
5
|
+
include Paging
|
|
6
|
+
attr_reader :selector, :options, :documents
|
|
7
7
|
|
|
8
|
-
delegate :
|
|
9
|
-
delegate :documents, :options, :selector, :to => :criteria
|
|
8
|
+
delegate :first, :last, :to => :execute
|
|
10
9
|
|
|
11
10
|
# Return aggregation counts of the grouped documents. This will count by
|
|
12
11
|
# the first field provided in the fields array.
|
|
@@ -20,33 +19,19 @@ module Mongoid #:nodoc:
|
|
|
20
19
|
counts
|
|
21
20
|
end
|
|
22
21
|
|
|
23
|
-
# Get the average value for the supplied field.
|
|
24
|
-
#
|
|
25
|
-
# Example:
|
|
26
|
-
#
|
|
27
|
-
# <tt>context.avg(:age)</tt>
|
|
28
|
-
#
|
|
29
|
-
# Returns:
|
|
30
|
-
#
|
|
31
|
-
# A numeric value that is the average.
|
|
32
|
-
def avg(field)
|
|
33
|
-
total = sum(field)
|
|
34
|
-
total ? (total.to_f / count) : nil
|
|
35
|
-
end
|
|
36
|
-
|
|
37
22
|
# Gets the number of documents in the array. Delegates to size.
|
|
38
23
|
def count
|
|
39
|
-
@count ||= documents.size
|
|
24
|
+
@count ||= @documents.size
|
|
40
25
|
end
|
|
41
26
|
|
|
42
|
-
#
|
|
43
|
-
# entire array or the susbset given the criteria.
|
|
27
|
+
# Groups the documents by the first field supplied in the field options.
|
|
44
28
|
#
|
|
45
|
-
#
|
|
29
|
+
# Returns:
|
|
46
30
|
#
|
|
47
|
-
#
|
|
48
|
-
def
|
|
49
|
-
|
|
31
|
+
# A +Hash+ with field values as keys, arrays of documents as values.
|
|
32
|
+
def group
|
|
33
|
+
field = @options[:fields].first
|
|
34
|
+
@documents.group_by { |doc| doc.send(field) }
|
|
50
35
|
end
|
|
51
36
|
|
|
52
37
|
# Enumerable implementation of execute. Returns matching documents for
|
|
@@ -56,17 +41,7 @@ module Mongoid #:nodoc:
|
|
|
56
41
|
#
|
|
57
42
|
# An +Array+ of documents that matched the selector.
|
|
58
43
|
def execute(paginating = false)
|
|
59
|
-
limit(documents.select { |document| document.matches?(selector) })
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Groups the documents by the first field supplied in the field options.
|
|
63
|
-
#
|
|
64
|
-
# Returns:
|
|
65
|
-
#
|
|
66
|
-
# A +Hash+ with field values as keys, arrays of documents as values.
|
|
67
|
-
def group
|
|
68
|
-
field = options[:fields].first
|
|
69
|
-
documents.group_by { |doc| doc.send(field) }
|
|
44
|
+
limit(@documents.select { |document| document.matches?(@selector) })
|
|
70
45
|
end
|
|
71
46
|
|
|
72
47
|
# Create the new enumerable context. This will need the selector and
|
|
@@ -75,19 +50,9 @@ module Mongoid #:nodoc:
|
|
|
75
50
|
#
|
|
76
51
|
# Example:
|
|
77
52
|
#
|
|
78
|
-
# <tt>Mongoid::Contexts::Enumerable.new(
|
|
79
|
-
def initialize(
|
|
80
|
-
@
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Iterate over each +Document+ in the results. This can take an optional
|
|
84
|
-
# block to pass to each argument in the results.
|
|
85
|
-
#
|
|
86
|
-
# Example:
|
|
87
|
-
#
|
|
88
|
-
# <tt>context.iterate { |doc| p doc }</tt>
|
|
89
|
-
def iterate(&block)
|
|
90
|
-
execute.each(&block)
|
|
53
|
+
# <tt>Mongoid::Contexts::Enumerable.new(selector, options, docs)</tt>
|
|
54
|
+
def initialize(selector, options, documents)
|
|
55
|
+
@selector, @options, @documents = selector, options, documents
|
|
91
56
|
end
|
|
92
57
|
|
|
93
58
|
# Get the largest value for the field in all the documents.
|
|
@@ -121,7 +86,7 @@ module Mongoid #:nodoc:
|
|
|
121
86
|
#
|
|
122
87
|
# The numerical sum of all the document field values.
|
|
123
88
|
def sum(field)
|
|
124
|
-
sum = documents.inject(nil) do |memo, doc|
|
|
89
|
+
sum = @documents.inject(nil) do |memo, doc|
|
|
125
90
|
value = doc.send(field)
|
|
126
91
|
memo ? memo += value : value
|
|
127
92
|
end
|
|
@@ -130,7 +95,7 @@ module Mongoid #:nodoc:
|
|
|
130
95
|
protected
|
|
131
96
|
# If the field exists, perform the comparison and set if true.
|
|
132
97
|
def determine(field, operator)
|
|
133
|
-
matching = documents.inject(nil) do |memo, doc|
|
|
98
|
+
matching = @documents.inject(nil) do |memo, doc|
|
|
134
99
|
value = doc.send(field)
|
|
135
100
|
(memo && memo.send(operator, value)) ? memo : value
|
|
136
101
|
end
|
|
@@ -138,11 +103,9 @@ module Mongoid #:nodoc:
|
|
|
138
103
|
|
|
139
104
|
# Limits the result set if skip and limit options.
|
|
140
105
|
def limit(documents)
|
|
141
|
-
skip, limit = options[:skip], options[:limit]
|
|
106
|
+
skip, limit = @options[:skip], @options[:limit]
|
|
142
107
|
if skip && limit
|
|
143
108
|
return documents.slice(skip, limit)
|
|
144
|
-
elsif limit
|
|
145
|
-
return documents.first(limit)
|
|
146
109
|
end
|
|
147
110
|
documents
|
|
148
111
|
end
|