mongoid-pre 2.0.0.beta1 → 2.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|