mongoid 2.0.0.alpha → 2.0.0.beta.5
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/lib/mongoid.rb +11 -5
- data/lib/mongoid/associations.rb +112 -107
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/embedded_in.rb +12 -4
- data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
- data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
- data/lib/mongoid/associations/has_many_related.rb +51 -5
- data/lib/mongoid/associations/has_one_related.rb +9 -5
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +15 -6
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +34 -13
- data/lib/mongoid/callbacks.rb +1 -2
- data/lib/mongoid/collection.rb +4 -3
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/master.rb +3 -2
- data/lib/mongoid/collections/slaves.rb +3 -2
- data/lib/mongoid/components.rb +4 -1
- data/lib/mongoid/config.rb +163 -13
- data/lib/mongoid/contexts.rb +1 -2
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +10 -2
- data/lib/mongoid/criteria.rb +13 -22
- data/lib/mongoid/criterion/exclusion.rb +3 -3
- data/lib/mongoid/criterion/inclusion.rb +17 -0
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +40 -85
- data/lib/mongoid/errors.rb +48 -1
- data/lib/mongoid/extensions.rb +11 -9
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
- data/lib/mongoid/extensions/date/conversions.rb +13 -4
- data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
- data/lib/mongoid/extensions/float/conversions.rb +5 -1
- data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
- data/lib/mongoid/extensions/hash/conversions.rb +34 -4
- data/lib/mongoid/extensions/integer/conversions.rb +5 -1
- data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
- data/lib/mongoid/extensions/object/conversions.rb +3 -3
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +15 -2
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -2
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -5
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +30 -22
- data/lib/mongoid/persistence.rb +218 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +47 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/railtie.rb +53 -0
- data/lib/mongoid/railties/database.rake +37 -0
- data/lib/mongoid/timestamps.rb +2 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +13 -2
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +3 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- metadata +76 -301
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -52
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -161
- data/lib/mongoid/commands/create.rb +0 -19
- data/lib/mongoid/commands/delete.rb +0 -16
- data/lib/mongoid/commands/delete_all.rb +0 -23
- data/lib/mongoid/commands/deletion.rb +0 -18
- data/lib/mongoid/commands/destroy.rb +0 -17
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -29
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -408
- data/perf/benchmark.rb +0 -77
- data/spec/integration/mongoid/associations_spec.rb +0 -340
- data/spec/integration/mongoid/attributes_spec.rb +0 -22
- data/spec/integration/mongoid/commands_spec.rb +0 -227
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
- data/spec/integration/mongoid/criteria_spec.rb +0 -272
- data/spec/integration/mongoid/document_spec.rb +0 -650
- data/spec/integration/mongoid/extensions_spec.rb +0 -22
- data/spec/integration/mongoid/finders_spec.rb +0 -119
- data/spec/integration/mongoid/inheritance_spec.rb +0 -137
- data/spec/integration/mongoid/named_scope_spec.rb +0 -46
- data/spec/models/address.rb +0 -39
- data/spec/models/animal.rb +0 -6
- data/spec/models/callbacks.rb +0 -18
- data/spec/models/comment.rb +0 -8
- data/spec/models/country_code.rb +0 -6
- data/spec/models/employer.rb +0 -5
- data/spec/models/game.rb +0 -7
- data/spec/models/inheritance.rb +0 -56
- data/spec/models/location.rb +0 -5
- data/spec/models/mixed_drink.rb +0 -4
- data/spec/models/name.rb +0 -13
- data/spec/models/namespacing.rb +0 -11
- data/spec/models/patient.rb +0 -4
- data/spec/models/person.rb +0 -99
- data/spec/models/pet.rb +0 -7
- data/spec/models/pet_owner.rb +0 -6
- data/spec/models/phone.rb +0 -7
- data/spec/models/post.rb +0 -15
- data/spec/models/translation.rb +0 -5
- data/spec/models/vet_visit.rb +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
- data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
- data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/associations/options_spec.rb +0 -192
- data/spec/unit/mongoid/associations_spec.rb +0 -595
- data/spec/unit/mongoid/attributes_spec.rb +0 -507
- data/spec/unit/mongoid/callbacks_spec.rb +0 -55
- data/spec/unit/mongoid/collection_spec.rb +0 -187
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
- data/spec/unit/mongoid/collections/master_spec.rb +0 -41
- data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
- data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
- data/spec/unit/mongoid/commands/create_spec.rb +0 -31
- data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
- data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
- data/spec/unit/mongoid/commands/save_spec.rb +0 -107
- data/spec/unit/mongoid/commands_spec.rb +0 -270
- data/spec/unit/mongoid/config_spec.rb +0 -172
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
- data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/criteria_spec.rb +0 -824
- data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
- data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
- data/spec/unit/mongoid/cursor_spec.rb +0 -74
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/document_spec.rb +0 -818
- data/spec/unit/mongoid/errors_spec.rb +0 -103
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
- 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/extensions/boolean/conversions_spec.rb +0 -49
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/factory_spec.rb +0 -31
- data/spec/unit/mongoid/field_spec.rb +0 -143
- data/spec/unit/mongoid/fields_spec.rb +0 -181
- data/spec/unit/mongoid/finders_spec.rb +0 -404
- data/spec/unit/mongoid/identity_spec.rb +0 -109
- data/spec/unit/mongoid/indexes_spec.rb +0 -93
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
- data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
- data/spec/unit/mongoid/matchers_spec.rb +0 -329
- data/spec/unit/mongoid/memoization_spec.rb +0 -75
- data/spec/unit/mongoid/named_scope_spec.rb +0 -123
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/scope_spec.rb +0 -240
- data/spec/unit/mongoid/state_spec.rb +0 -83
- data/spec/unit/mongoid/timestamps_spec.rb +0 -25
- data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
- data/spec/unit/mongoid/validations_spec.rb +0 -190
- data/spec/unit/mongoid/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
# Insert is a persistence command responsible for taking a document that
|
5
|
+
# has not been saved to the database and saving it. This specific class
|
6
|
+
# handles the case when the document is embedded in another.
|
7
|
+
#
|
8
|
+
# The underlying query resembles the following MongoDB query:
|
9
|
+
#
|
10
|
+
# collection.insert(
|
11
|
+
# { "_id" : 1, "field" : "value" },
|
12
|
+
# false
|
13
|
+
# );
|
14
|
+
class InsertEmbedded < Command
|
15
|
+
# Insert the new document in the database. If the document's parent is a
|
16
|
+
# new record, we will call save on the parent, otherwise we will $push
|
17
|
+
# the document onto the parent.
|
18
|
+
#
|
19
|
+
# Example:
|
20
|
+
#
|
21
|
+
# <tt>Insert.persist</tt>
|
22
|
+
#
|
23
|
+
# Returns:
|
24
|
+
#
|
25
|
+
# The +Document+, whether the insert succeeded or not.
|
26
|
+
def persist
|
27
|
+
parent = @document._parent
|
28
|
+
if parent.new_record?
|
29
|
+
parent.insert
|
30
|
+
else
|
31
|
+
update = { @document._inserter => { @document._position => @document.raw_attributes } }
|
32
|
+
@collection.update(parent._selector, update, @options.merge(:multi => false))
|
33
|
+
end
|
34
|
+
@document.new_record = false; @document
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
# Remove is a persistence command responsible for deleting a document from
|
5
|
+
# the database.
|
6
|
+
#
|
7
|
+
# The underlying query resembles the following MongoDB query:
|
8
|
+
#
|
9
|
+
# collection.remove(
|
10
|
+
# { "_id" : 1 },
|
11
|
+
# false
|
12
|
+
# );
|
13
|
+
class Remove < Command
|
14
|
+
# Remove the document from the database: delegates to the MongoDB
|
15
|
+
# collection remove method.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# <tt>Remove.persist</tt>
|
20
|
+
#
|
21
|
+
# Returns:
|
22
|
+
#
|
23
|
+
# +true+ if success, +false+ if not.
|
24
|
+
def persist
|
25
|
+
remove
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
# Remove the document from the database.
|
30
|
+
def remove
|
31
|
+
if @document.embedded?
|
32
|
+
Persistence::RemoveEmbedded.new(@document, @validate).persist
|
33
|
+
else
|
34
|
+
@collection.remove({ :_id => @document.id }, @options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
# Remove is a persistence command responsible for deleting a document from
|
5
|
+
# the database.
|
6
|
+
#
|
7
|
+
# The underlying query resembles the following MongoDB query:
|
8
|
+
#
|
9
|
+
# collection.remove(
|
10
|
+
# { "field" : value },
|
11
|
+
# false
|
12
|
+
# );
|
13
|
+
class RemoveAll < Command
|
14
|
+
# Remove the document from the database: delegates to the MongoDB
|
15
|
+
# collection remove method.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# <tt>Remove.persist</tt>
|
20
|
+
#
|
21
|
+
# Returns:
|
22
|
+
#
|
23
|
+
# +true+ if success, +false+ if not.
|
24
|
+
def persist
|
25
|
+
remove
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
# Remove the document from the database.
|
30
|
+
def remove
|
31
|
+
count = @collection.find(@selector.merge(:_type => @klass.name)).count
|
32
|
+
@collection.remove(@selector, @options)
|
33
|
+
count
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
# Remove is a persistence command responsible for deleting a document from
|
5
|
+
# the database.
|
6
|
+
#
|
7
|
+
# The underlying query resembles the following MongoDB query:
|
8
|
+
#
|
9
|
+
# collection.remove(
|
10
|
+
# { "_id" : 1 },
|
11
|
+
# false
|
12
|
+
# );
|
13
|
+
class RemoveEmbedded < Command
|
14
|
+
# Insert the new document in the database. If the document's parent is a
|
15
|
+
# new record, we will call save on the parent, otherwise we will $push
|
16
|
+
# the document onto the parent.
|
17
|
+
#
|
18
|
+
# Remove the document from the database. If the parent is a new record,
|
19
|
+
# it will get removed in Ruby only. If the parent is not a new record
|
20
|
+
# then either an $unset or $set will occur, depending if it's an
|
21
|
+
# embeds_one or embeds_many.
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
#
|
25
|
+
# <tt>RemoveEmbedded.persist</tt>
|
26
|
+
#
|
27
|
+
# Returns:
|
28
|
+
#
|
29
|
+
# +true+ or +false+, depending on if the removal passed.
|
30
|
+
def persist
|
31
|
+
parent = @document._parent
|
32
|
+
parent.remove(@document)
|
33
|
+
unless parent.new_record?
|
34
|
+
update = { @document._remover => removal_selector }
|
35
|
+
@collection.update(parent._selector, update, @options.merge(:multi => false))
|
36
|
+
end; true
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
# Get the value to pass to the removal modifier.
|
41
|
+
def setter
|
42
|
+
@document._index ? @document.id : true
|
43
|
+
end
|
44
|
+
|
45
|
+
def removal_selector
|
46
|
+
@document._index ? { @document._pull => { "_id" => @document.id } } : { @document._path => setter }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
# Update is a persistence command responsible for taking a document that
|
5
|
+
# has already been saved to the database and saving it, depending on
|
6
|
+
# whether or not the document has been modified.
|
7
|
+
#
|
8
|
+
# Before persisting the command will check via dirty attributes if the
|
9
|
+
# document has changed, if not, it will simply return true. If it has it
|
10
|
+
# will go through the validation steps, run callbacks, and set the changed
|
11
|
+
# fields atomically on the document. The underlying query resembles the
|
12
|
+
# following MongoDB query:
|
13
|
+
#
|
14
|
+
# collection.update(
|
15
|
+
# { "_id" : 1,
|
16
|
+
# { "$set" : { "field" : "value" },
|
17
|
+
# false,
|
18
|
+
# false
|
19
|
+
# );
|
20
|
+
#
|
21
|
+
# For embedded documents it will use the positional locator:
|
22
|
+
#
|
23
|
+
# collection.update(
|
24
|
+
# { "_id" : 1, "addresses._id" : 2 },
|
25
|
+
# { "$set" : { "addresses.$.field" : "value" },
|
26
|
+
# false,
|
27
|
+
# false
|
28
|
+
# );
|
29
|
+
#
|
30
|
+
class Update < Command
|
31
|
+
# Persist the document that is to be updated to the database. This will
|
32
|
+
# only write changed fields via MongoDB's $set modifier operation.
|
33
|
+
#
|
34
|
+
# Example:
|
35
|
+
#
|
36
|
+
# <tt>Update.persist</tt>
|
37
|
+
#
|
38
|
+
# Returns:
|
39
|
+
#
|
40
|
+
# +true+ or +false+, depending on validation.
|
41
|
+
def persist
|
42
|
+
return false if validate && !@document.valid?
|
43
|
+
@document.run_callbacks(:save) do
|
44
|
+
@document.run_callbacks(:update) do
|
45
|
+
if update
|
46
|
+
@document.move_changes
|
47
|
+
else
|
48
|
+
return false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end; true
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
# Update the document in the database atomically.
|
56
|
+
def update
|
57
|
+
if @document.changed?
|
58
|
+
@collection.update(@document._selector, { "$set" => @document.setters }, @options.merge(:multi => false))
|
59
|
+
end; true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Rails #:nodoc:
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
class Railtie < Rails::Railtie #:nodoc:
|
4
|
+
|
5
|
+
# do we want a custom log subscriber for mongoid?
|
6
|
+
# log_subscriber :mongoid, ::Mongoid::Railties::LogSubscriber.new
|
7
|
+
|
8
|
+
rake_tasks do
|
9
|
+
load "mongoid/railties/database.rake"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Initialize Mongoid. This will look for a mongoid.yml in the config
|
13
|
+
# directory and configure mongoid appropriately.
|
14
|
+
#
|
15
|
+
# Example mongoid.yml:
|
16
|
+
#
|
17
|
+
# defaults: &defaults
|
18
|
+
# host: localhost
|
19
|
+
# slaves:
|
20
|
+
# # - host: localhost
|
21
|
+
# # port: 27018
|
22
|
+
# # - host: localhost
|
23
|
+
# # port: 27019
|
24
|
+
# allow_dynamic_fields: false
|
25
|
+
# parameterize_keys: false
|
26
|
+
# persist_in_safe_mode: false
|
27
|
+
#
|
28
|
+
# development:
|
29
|
+
# <<: *defaults
|
30
|
+
# database: mongoid
|
31
|
+
initializer "setup database" do
|
32
|
+
config_file = Rails.root.join("config", "mongoid.yml")
|
33
|
+
if config_file.file?
|
34
|
+
settings = YAML.load(ERB.new(config_file.read).result)[Rails.env]
|
35
|
+
::Mongoid.from_hash(settings) if settings.present?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
initializer "verify that mongoid is configured" do
|
40
|
+
config.after_initialize do
|
41
|
+
begin
|
42
|
+
::Mongoid.master
|
43
|
+
rescue ::Mongoid::Errors::InvalidDatabase => e
|
44
|
+
unless Rails.root.join("config", "mongoid.yml").file?
|
45
|
+
puts "\nMongoid config not found. Create a config file at: config/mongoid.yml"
|
46
|
+
puts "to generate one run: script/rails generate mongoid:config\n\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
namespace :db do
|
2
|
+
|
3
|
+
desc 'Drops all the collections for the database for the current Rails.env'
|
4
|
+
task :drop => :environment do
|
5
|
+
Mongoid.master.collections.each{|col| col.drop unless col.name == 'system.users' }
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Load the seed data from db/seeds.rb'
|
9
|
+
task :seed => :environment do
|
10
|
+
seed_file = File.join(Rails.root, 'db', 'seeds.rb')
|
11
|
+
load(seed_file) if File.exist?(seed_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Create the database, and initialize with the seed data'
|
15
|
+
task :setup => [ 'db:create', 'db:seed' ]
|
16
|
+
|
17
|
+
desc 'Delete data and seed'
|
18
|
+
task :reseed => [ 'db:drop', 'db:seed' ]
|
19
|
+
|
20
|
+
task :create => :environment do
|
21
|
+
# noop
|
22
|
+
end
|
23
|
+
|
24
|
+
task :migrate => :environment do
|
25
|
+
# noop
|
26
|
+
end
|
27
|
+
|
28
|
+
namespace :schema do
|
29
|
+
task :load do
|
30
|
+
# noop
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
########
|
35
|
+
# TODO: lots more useful db tasks can be added here. stuff like copyDatabase, etc
|
36
|
+
########
|
37
|
+
end
|
data/lib/mongoid/timestamps.rb
CHANGED
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
|
|
5
5
|
included do
|
6
6
|
field :created_at, :type => Time
|
7
7
|
field :updated_at, :type => Time
|
8
|
-
|
8
|
+
set_callback :create, :before, :set_created_at
|
9
|
+
set_callback :save, :before, :set_updated_at
|
9
10
|
end
|
10
11
|
|
11
12
|
module InstanceMethods
|
@@ -22,6 +23,5 @@ module Mongoid #:nodoc:
|
|
22
23
|
self.updated_at = Time.now.utc
|
23
24
|
end
|
24
25
|
end
|
25
|
-
|
26
26
|
end
|
27
27
|
end
|
data/lib/mongoid/validations.rb
CHANGED
@@ -14,8 +14,19 @@ module Mongoid #:nodoc:
|
|
14
14
|
# end
|
15
15
|
class UniquenessValidator < ActiveModel::EachValidator
|
16
16
|
def validate_each(document, attribute, value)
|
17
|
-
|
18
|
-
|
17
|
+
conditions = {attribute => value}
|
18
|
+
conditions[options[:scope]] = document.attributes[options[:scope]] if options.has_key? :scope
|
19
|
+
return if document.class.where(conditions).empty?
|
20
|
+
if document.new_record? || key_changed?(document)
|
21
|
+
document.errors.add(attribute, :taken, :default => options[:message], :value => value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
def key_changed?(document)
|
27
|
+
(document.primary_key || {}).each do |key|
|
28
|
+
return true if document.send("#{key}_changed?")
|
29
|
+
end; false
|
19
30
|
end
|
20
31
|
end
|
21
32
|
end
|
data/lib/mongoid/versioning.rb
CHANGED
@@ -7,8 +7,8 @@ module Mongoid #:nodoc:
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
included do
|
9
9
|
field :version, :type => Integer, :default => 1
|
10
|
-
|
11
|
-
|
10
|
+
embeds_many :versions, :class_name => self.name
|
11
|
+
set_callback :save, :before, :revise
|
12
12
|
end
|
13
13
|
module InstanceMethods
|
14
14
|
# Create a new version of the +Document+. This will load the previous
|
@@ -19,6 +19,7 @@ module Mongoid #:nodoc:
|
|
19
19
|
if last_version
|
20
20
|
self.versions << last_version.clone
|
21
21
|
self.version = version + 1
|
22
|
+
@modifications["versions"] = [ nil, @attributes["versions"] ] if @modifications
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rails/generators/mongoid_generator'
|
3
|
+
|
4
|
+
module Mongoid
|
5
|
+
module Generators
|
6
|
+
class ConfigGenerator < Rails::Generators::Base
|
7
|
+
desc "Creates a Mongoid configuration file at config/mongoid.yml"
|
8
|
+
|
9
|
+
argument :database_name, :type => :string, :optional => true
|
10
|
+
|
11
|
+
def self.source_root
|
12
|
+
@_mongoid_source_root ||= File.expand_path("../templates", __FILE__)
|
13
|
+
end
|
14
|
+
|
15
|
+
def app_name
|
16
|
+
Rails::Application.subclasses.first.parent.to_s.underscore
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_config_file
|
20
|
+
template 'mongoid.yml', File.join('config', "mongoid.yml")
|
21
|
+
end
|
22
|
+
|
23
|
+
def inject_mongoid_into_application
|
24
|
+
config_application_path = File.join("config", "application.rb")
|
25
|
+
config_contents = File.read(config_application_path)
|
26
|
+
|
27
|
+
mongoid_require = "\n\nrequire 'mongoid/railtie'"
|
28
|
+
|
29
|
+
# check to see if its already been included
|
30
|
+
return if config_contents.include?(mongoid_require)
|
31
|
+
|
32
|
+
if config_contents.include?("require 'rails/all'")
|
33
|
+
inject_into_file config_application_path, mongoid_require, :after => "require 'rails/all'"
|
34
|
+
elsif config_contents.include?("require \"action_controller/railtie\"")
|
35
|
+
inject_into_file config_application_path, mongoid_require, :after => "require \"action_controller/railtie\""
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|