mongoid 2.0.0.rc.6 → 2.0.0.rc.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -2
- data/lib/config/locales/bg.yml +3 -6
- data/lib/config/locales/de.yml +2 -5
- data/lib/config/locales/en.yml +2 -5
- data/lib/config/locales/es.yml +2 -5
- data/lib/config/locales/fr.yml +2 -5
- data/lib/config/locales/hu.yml +2 -5
- data/lib/config/locales/it.yml +2 -5
- data/lib/config/locales/kr.yml +2 -5
- data/lib/config/locales/nl.yml +2 -5
- data/lib/config/locales/pl.yml +2 -5
- data/lib/config/locales/pt-br.yml +2 -5
- data/lib/config/locales/pt.yml +2 -5
- data/lib/config/locales/ro.yml +2 -5
- data/lib/config/locales/ru.yml +41 -0
- data/lib/config/locales/sv.yml +2 -5
- data/lib/config/locales/zh-CN.yml +3 -6
- data/lib/mongoid/atomicity.rb +2 -2
- data/lib/mongoid/attributes.rb +40 -69
- data/lib/mongoid/attributes/processing.rb +142 -0
- data/lib/mongoid/collections.rb +1 -0
- data/lib/mongoid/components.rb +1 -1
- data/lib/mongoid/config.rb +0 -1
- data/lib/mongoid/contexts/mongo.rb +13 -9
- data/lib/mongoid/criteria.rb +15 -1
- data/lib/mongoid/criterion/inclusion.rb +36 -11
- data/lib/mongoid/criterion/inspection.rb +3 -1
- data/lib/mongoid/criterion/optional.rb +2 -2
- data/lib/mongoid/dirty.rb +1 -0
- data/lib/mongoid/document.rb +11 -5
- data/lib/mongoid/extensions/integer/conversions.rb +2 -2
- data/lib/mongoid/extensions/object_id/conversions.rb +62 -32
- data/lib/mongoid/field.rb +5 -2
- data/lib/mongoid/identity.rb +2 -1
- data/lib/mongoid/matchers.rb +5 -32
- data/lib/mongoid/matchers/default.rb +53 -10
- data/lib/mongoid/matchers/or.rb +30 -0
- data/lib/mongoid/matchers/strategies.rb +63 -0
- data/lib/mongoid/multi_parameter_attributes.rb +4 -2
- data/lib/mongoid/nested_attributes.rb +8 -0
- data/lib/mongoid/persistence.rb +2 -1
- data/lib/mongoid/persistence/insert.rb +3 -3
- data/lib/mongoid/persistence/insert_embedded.rb +2 -1
- data/lib/mongoid/relations.rb +2 -1
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -0
- data/lib/mongoid/relations/cascading.rb +1 -1
- data/lib/mongoid/relations/cascading/nullify.rb +1 -1
- data/lib/mongoid/relations/constraint.rb +42 -0
- data/lib/mongoid/relations/cyclic.rb +6 -0
- data/lib/mongoid/relations/embedded/many.rb +4 -4
- data/lib/mongoid/relations/macros.rb +1 -1
- data/lib/mongoid/relations/many.rb +1 -0
- data/lib/mongoid/relations/metadata.rb +12 -4
- data/lib/mongoid/relations/nested_builder.rb +1 -3
- data/lib/mongoid/relations/referenced/many.rb +11 -18
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -32
- data/lib/mongoid/relations/referenced/one.rb +3 -1
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/validations/associated.rb +11 -9
- data/lib/mongoid/validations/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +2 -2
- metadata +9 -4
@@ -7,6 +7,10 @@ module Mongoid # :nodoc:
|
|
7
7
|
module Cyclic
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
+
included do
|
11
|
+
class_attribute :cyclic
|
12
|
+
end
|
13
|
+
|
10
14
|
module ClassMethods #:nodoc:
|
11
15
|
|
12
16
|
# Create a cyclic embedded relation that creates a tree hierarchy for
|
@@ -32,6 +36,7 @@ module Mongoid # :nodoc:
|
|
32
36
|
#
|
33
37
|
# @since 2.0.0.rc.1
|
34
38
|
def recursively_embeds_many
|
39
|
+
self.cyclic = true
|
35
40
|
embeds_many cyclic_child_name, :class_name => self.name, :cyclic => true
|
36
41
|
embedded_in cyclic_parent_name, :class_name => self.name, :cyclic => true
|
37
42
|
end
|
@@ -59,6 +64,7 @@ module Mongoid # :nodoc:
|
|
59
64
|
#
|
60
65
|
# @since 2.0.0.rc.1
|
61
66
|
def recursively_embeds_one
|
67
|
+
self.cyclic = true
|
62
68
|
embeds_one cyclic_child_name(false), :class_name => self.name, :cyclic => true
|
63
69
|
embedded_in cyclic_parent_name, :class_name => self.name, :cyclic => true
|
64
70
|
end
|
@@ -259,15 +259,15 @@ module Mongoid # :nodoc:
|
|
259
259
|
# Get this relation as as its representation in the database.
|
260
260
|
#
|
261
261
|
# @example Convert the relation to an attributes hash.
|
262
|
-
# person.addresses.
|
262
|
+
# person.addresses.as_document
|
263
263
|
#
|
264
264
|
# @return [ Array<Hash> ] The relation as stored in the db.
|
265
265
|
#
|
266
266
|
# @since 2.0.0.rc.1
|
267
|
-
def
|
267
|
+
def as_document
|
268
268
|
target.inject([]) do |attributes, doc|
|
269
269
|
attributes.tap do |attr|
|
270
|
-
attr << doc.
|
270
|
+
attr << doc.as_document
|
271
271
|
end
|
272
272
|
end
|
273
273
|
end
|
@@ -354,7 +354,7 @@ module Mongoid # :nodoc:
|
|
354
354
|
load!(:binding => true) and return super if target.respond_to?(name)
|
355
355
|
klass = metadata.klass
|
356
356
|
klass.send(:with_scope, criteria) do
|
357
|
-
|
357
|
+
criteria.send(name, *args)
|
358
358
|
end
|
359
359
|
end
|
360
360
|
|
@@ -297,7 +297,7 @@ module Mongoid # :nodoc:
|
|
297
297
|
# @param [ Symbol ] name The name of the relation.
|
298
298
|
# @param [ Metadata ] metadata The metadata for the relation.
|
299
299
|
def relate(name, metadata)
|
300
|
-
relations
|
300
|
+
self.relations = relations.merge(name.to_s => metadata)
|
301
301
|
getter(name, metadata).setter(name, metadata)
|
302
302
|
end
|
303
303
|
end
|
@@ -6,7 +6,7 @@ module Mongoid # :nodoc:
|
|
6
6
|
# contains everything you could ever possible want to know.
|
7
7
|
class Metadata < Hash
|
8
8
|
|
9
|
-
delegate :foreign_key_default, :to => :relation
|
9
|
+
delegate :foreign_key_default, :stores_foreign_key?, :to => :relation
|
10
10
|
|
11
11
|
# Gets a relation builder associated with the relation this metadata is
|
12
12
|
# for.
|
@@ -55,6 +55,10 @@ module Mongoid # :nodoc:
|
|
55
55
|
@class_name ||= (self[:class_name] || classify)
|
56
56
|
end
|
57
57
|
|
58
|
+
def constraint
|
59
|
+
@constraint ||= Constraint.new(self)
|
60
|
+
end
|
61
|
+
|
58
62
|
# Will determine if the relation is an embedded one or not. Currently
|
59
63
|
# only checks against embeds one and many.
|
60
64
|
#
|
@@ -420,12 +424,16 @@ module Mongoid # :nodoc:
|
|
420
424
|
suffix = relation.foreign_key_suffix
|
421
425
|
if relation.stores_foreign_key?
|
422
426
|
if relation.macro == :references_and_referenced_in_many
|
423
|
-
name.to_s.singularize
|
427
|
+
"#{name.to_s.singularize}#{suffix}"
|
424
428
|
else
|
425
|
-
name
|
429
|
+
"#{name}#{suffix}"
|
426
430
|
end
|
427
431
|
else
|
428
|
-
polymorphic?
|
432
|
+
if polymorphic?
|
433
|
+
"#{self[:as]}#{suffix}"
|
434
|
+
else
|
435
|
+
inverse_of ? "#{inverse_of}#{suffix}" : inverse_class_name.foreign_key
|
436
|
+
end
|
429
437
|
end
|
430
438
|
end
|
431
439
|
|
@@ -61,9 +61,7 @@ module Mongoid # :nodoc:
|
|
61
61
|
#
|
62
62
|
# @since 2.0.0.rc.6
|
63
63
|
def convert_id(id)
|
64
|
-
|
65
|
-
model = metadata.klass
|
66
|
-
model.using_object_ids? ? BSON::ObjectId.cast!(model, id) : id.class.set(id)
|
64
|
+
metadata.constraint.convert(id)
|
67
65
|
end
|
68
66
|
end
|
69
67
|
end
|
@@ -36,9 +36,9 @@ module Mongoid #:nodoc:
|
|
36
36
|
# person.posts.clear
|
37
37
|
#
|
38
38
|
# @return [ Many ] The relation emptied.
|
39
|
-
def clear
|
39
|
+
def clear(options = {})
|
40
40
|
load! and tap do |relation|
|
41
|
-
relation.unbind(default_options)
|
41
|
+
relation.unbind(default_options(options))
|
42
42
|
target.clear
|
43
43
|
end
|
44
44
|
end
|
@@ -155,12 +155,8 @@ module Mongoid #:nodoc:
|
|
155
155
|
#
|
156
156
|
# @return [ Document, Criteria ] The matching document(s).
|
157
157
|
def find(arg, options = {})
|
158
|
-
|
159
|
-
|
160
|
-
selector = (options[:conditions] || {}).merge(
|
161
|
-
metadata.foreign_key => base.id
|
162
|
-
)
|
163
|
-
klass.find(arg, :conditions => selector)
|
158
|
+
return criteria.id_criteria(arg) unless arg.is_a?(Symbol)
|
159
|
+
criteria.find(arg, :conditions => options[:conditions] || {})
|
164
160
|
end
|
165
161
|
|
166
162
|
# Instantiate a new references_many relation. Will set the foreign key
|
@@ -204,13 +200,7 @@ module Mongoid #:nodoc:
|
|
204
200
|
#
|
205
201
|
# @since 2.0.0.rc.1
|
206
202
|
def nullify
|
207
|
-
|
208
|
-
doc.send(metadata.foreign_key_setter, nil)
|
209
|
-
doc.send(
|
210
|
-
:remove_instance_variable, "@#{metadata.inverse(doc)}"
|
211
|
-
)
|
212
|
-
doc.save
|
213
|
-
end
|
203
|
+
clear(:binding => true, :continue => true, :nullify => true)
|
214
204
|
end
|
215
205
|
alias :nullify_all :nullify
|
216
206
|
|
@@ -252,7 +242,10 @@ module Mongoid #:nodoc:
|
|
252
242
|
# @since 2.0.0.rc.1
|
253
243
|
def unbind(options = {})
|
254
244
|
binding.unbind(options)
|
255
|
-
|
245
|
+
if base.persisted?
|
246
|
+
target.each(&:delete) unless options[:binding]
|
247
|
+
target.each(&:save) if options[:nullify]
|
248
|
+
end
|
256
249
|
[]
|
257
250
|
end
|
258
251
|
|
@@ -312,7 +305,7 @@ module Mongoid #:nodoc:
|
|
312
305
|
load!(:binding => true) and return super if [].respond_to?(name)
|
313
306
|
klass = metadata.klass
|
314
307
|
klass.send(:with_scope, criteria) do
|
315
|
-
|
308
|
+
criteria.send(name, *args)
|
316
309
|
end
|
317
310
|
end
|
318
311
|
|
@@ -347,7 +340,7 @@ module Mongoid #:nodoc:
|
|
347
340
|
#
|
348
341
|
# @since 2.0.0.rc.1
|
349
342
|
def builder(meta, object)
|
350
|
-
Builders::Referenced::Many.new(meta, object)
|
343
|
+
Builders::Referenced::Many.new(meta, object || [])
|
351
344
|
end
|
352
345
|
|
353
346
|
# Returns true if the relation is an embedded one. In this case
|
@@ -7,6 +7,25 @@ module Mongoid # :nodoc:
|
|
7
7
|
# many-to-many between documents in different collections.
|
8
8
|
class ManyToMany < Referenced::Many
|
9
9
|
|
10
|
+
# Appends a document or array of documents to the relation. Will set
|
11
|
+
# the parent and update the index in the process.
|
12
|
+
#
|
13
|
+
# @example Append a document.
|
14
|
+
# person.addresses << address
|
15
|
+
#
|
16
|
+
# @example Push a document.
|
17
|
+
# person.addresses.push(address)
|
18
|
+
#
|
19
|
+
# @example Concat with other documents.
|
20
|
+
# perosn.addresses.concat([ address_one, address_two ])
|
21
|
+
#
|
22
|
+
# @param [ Document, Array<Document> ] *args Any number of documents.
|
23
|
+
def <<(*args)
|
24
|
+
options = default_options(args)
|
25
|
+
super(args)
|
26
|
+
base.save if base.persisted? && !options[:binding]
|
27
|
+
end
|
28
|
+
|
10
29
|
# Creates a new document on the references many relation. This will
|
11
30
|
# save the document if the parent has been persisted.
|
12
31
|
#
|
@@ -94,38 +113,6 @@ module Mongoid # :nodoc:
|
|
94
113
|
metadata.klass.destroy_all(:conditions => selector.merge(scoping))
|
95
114
|
end
|
96
115
|
|
97
|
-
# Find the matchind document on the association, either based on id or
|
98
|
-
# conditions.
|
99
|
-
#
|
100
|
-
# @example Find by an id.
|
101
|
-
# person.preferences.find(BSON::ObjectId.new)
|
102
|
-
#
|
103
|
-
# @example Find by multiple ids.
|
104
|
-
# person.preferences.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
105
|
-
#
|
106
|
-
# @example Conditionally find all matching documents.
|
107
|
-
# person.preferences.find(:all, :conditions => { :title => "Sir" })
|
108
|
-
#
|
109
|
-
# @example Conditionally find the first document.
|
110
|
-
# person.preferences.find(:first, :conditions => { :title => "Sir" })
|
111
|
-
#
|
112
|
-
# @example Conditionally find the last document.
|
113
|
-
# person.preferences.find(:last, :conditions => { :title => "Sir" })
|
114
|
-
#
|
115
|
-
# @param [ Symbol, BSON::ObjectId, Array<BSON::ObjectId> ] arg The
|
116
|
-
# argument to search with.
|
117
|
-
# @param [ Hash ] options The options to search with.
|
118
|
-
#
|
119
|
-
# @return [ Document, Criteria ] The matching document(s).
|
120
|
-
def find(arg, options = {})
|
121
|
-
klass = metadata.klass
|
122
|
-
return klass.criteria.id_criteria(arg) unless arg.is_a?(Symbol)
|
123
|
-
selector = (options[:conditions] || {}).merge(
|
124
|
-
"_id" => { "$in" => base.send(metadata.foreign_key) }
|
125
|
-
)
|
126
|
-
klass.find(arg, :conditions => selector)
|
127
|
-
end
|
128
|
-
|
129
116
|
# Removes all associations between the base document and the target
|
130
117
|
# documents by deleting the foreign keys and the references, orphaning
|
131
118
|
# the target documents in the process.
|
@@ -77,7 +77,9 @@ module Mongoid # :nodoc:
|
|
77
77
|
# @since 2.0.0.rc.1
|
78
78
|
def unbind(old_target, options = {})
|
79
79
|
binding(old_target).unbind(options)
|
80
|
-
|
80
|
+
if base.persisted? && !old_target.destroyed? && !options[:binding]
|
81
|
+
old_target.delete
|
82
|
+
end
|
81
83
|
end
|
82
84
|
|
83
85
|
private
|
data/lib/mongoid/timestamps.rb
CHANGED
@@ -11,7 +11,7 @@ module Mongoid #:nodoc:
|
|
11
11
|
field :updated_at, :type => Time
|
12
12
|
|
13
13
|
set_callback :create, :before, :set_created_at
|
14
|
-
set_callback :save, :before, :set_updated_at
|
14
|
+
set_callback :save, :before, :set_updated_at, :if => Proc.new {|d| d.new_record? || d.changed? }
|
15
15
|
|
16
16
|
class_attribute :record_timestamps
|
17
17
|
self.record_timestamps = true
|
@@ -27,15 +27,17 @@ module Mongoid #:nodoc:
|
|
27
27
|
# @param [ Symbol ] attribute The relation to validate.
|
28
28
|
# @param [ Object ] value The value of the relation.
|
29
29
|
def validate_each(document, attribute, value)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
document.validated = true
|
31
|
+
valid = Array.wrap(value).collect do |doc|
|
32
|
+
if doc.nil?
|
33
|
+
true
|
34
|
+
else
|
35
|
+
doc.validated? ? true : doc.valid?
|
36
|
+
end
|
37
|
+
end.all?
|
38
|
+
document.validated = false
|
39
|
+
return if valid
|
40
|
+
document.errors.add(attribute, :invalid, options.merge(:value => value))
|
39
41
|
end
|
40
42
|
end
|
41
43
|
end
|
data/lib/mongoid/version.rb
CHANGED
data/lib/mongoid/versioning.rb
CHANGED
@@ -10,7 +10,7 @@ module Mongoid #:nodoc:
|
|
10
10
|
included do
|
11
11
|
field :version, :type => Integer, :default => 1
|
12
12
|
embeds_many :versions, :class_name => self.name, :validate => false
|
13
|
-
set_callback :save, :before, :revise
|
13
|
+
set_callback :save, :before, :revise, :if => :changed?
|
14
14
|
|
15
15
|
delegate :version_max, :to => "self.class"
|
16
16
|
end
|
@@ -28,7 +28,7 @@ module Mongoid #:nodoc:
|
|
28
28
|
versions.target << last_version.clone
|
29
29
|
versions.shift if version_max.present? && versions.length > version_max
|
30
30
|
self.version = (version || 1 ) + 1
|
31
|
-
@modifications["versions"] = [ nil, versions.
|
31
|
+
@modifications["versions"] = [ nil, versions.as_document ] if @modifications
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- rc
|
10
|
-
-
|
11
|
-
version: 2.0.0.rc.
|
10
|
+
- 7
|
11
|
+
version: 2.0.0.rc.7
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Durran Jordan
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-01-
|
19
|
+
date: 2011-01-29 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -157,9 +157,11 @@ files:
|
|
157
157
|
- lib/config/locales/pt-br.yml
|
158
158
|
- lib/config/locales/pt.yml
|
159
159
|
- lib/config/locales/ro.yml
|
160
|
+
- lib/config/locales/ru.yml
|
160
161
|
- lib/config/locales/sv.yml
|
161
162
|
- lib/config/locales/zh-CN.yml
|
162
163
|
- lib/mongoid/atomicity.rb
|
164
|
+
- lib/mongoid/attributes/processing.rb
|
163
165
|
- lib/mongoid/attributes.rb
|
164
166
|
- lib/mongoid/callbacks.rb
|
165
167
|
- lib/mongoid/collection.rb
|
@@ -254,7 +256,9 @@ files:
|
|
254
256
|
- lib/mongoid/matchers/lte.rb
|
255
257
|
- lib/mongoid/matchers/ne.rb
|
256
258
|
- lib/mongoid/matchers/nin.rb
|
259
|
+
- lib/mongoid/matchers/or.rb
|
257
260
|
- lib/mongoid/matchers/size.rb
|
261
|
+
- lib/mongoid/matchers/strategies.rb
|
258
262
|
- lib/mongoid/matchers.rb
|
259
263
|
- lib/mongoid/modifiers/command.rb
|
260
264
|
- lib/mongoid/modifiers/inc.rb
|
@@ -303,6 +307,7 @@ files:
|
|
303
307
|
- lib/mongoid/relations/cascading/nullify.rb
|
304
308
|
- lib/mongoid/relations/cascading/strategy.rb
|
305
309
|
- lib/mongoid/relations/cascading.rb
|
310
|
+
- lib/mongoid/relations/constraint.rb
|
306
311
|
- lib/mongoid/relations/cyclic.rb
|
307
312
|
- lib/mongoid/relations/embedded/in.rb
|
308
313
|
- lib/mongoid/relations/embedded/many.rb
|
@@ -355,7 +360,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
355
360
|
requirements:
|
356
361
|
- - ">="
|
357
362
|
- !ruby/object:Gem::Version
|
358
|
-
hash:
|
363
|
+
hash: -2421077816225192598
|
359
364
|
segments:
|
360
365
|
- 0
|
361
366
|
version: "0"
|