mongoid 2.0.0.beta.20 → 2.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +8 -0
- data/Rakefile +51 -0
- data/lib/config/locales/nl.yml +39 -0
- data/lib/config/locales/ro.yml +1 -1
- data/lib/mongoid.rb +17 -17
- data/lib/mongoid/atomicity.rb +54 -22
- data/lib/mongoid/attributes.rb +145 -125
- data/lib/mongoid/callbacks.rb +7 -2
- data/lib/mongoid/collection.rb +49 -32
- data/lib/mongoid/collections.rb +0 -1
- data/lib/mongoid/components.rb +34 -29
- data/lib/mongoid/config.rb +207 -193
- data/lib/mongoid/config/database.rb +167 -0
- data/lib/mongoid/contexts.rb +2 -5
- data/lib/mongoid/contexts/enumerable.rb +30 -4
- data/lib/mongoid/contexts/ids.rb +2 -2
- data/lib/mongoid/contexts/mongo.rb +30 -5
- data/lib/mongoid/copyable.rb +44 -0
- data/lib/mongoid/criteria.rb +110 -56
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/destructive.rb +37 -0
- data/lib/mongoid/criterion/exclusion.rb +3 -1
- data/lib/mongoid/criterion/inclusion.rb +59 -64
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +42 -54
- data/lib/mongoid/criterion/selector.rb +9 -0
- data/lib/mongoid/default_scope.rb +28 -0
- data/lib/mongoid/deprecation.rb +5 -5
- data/lib/mongoid/dirty.rb +4 -5
- data/lib/mongoid/document.rb +161 -114
- data/lib/mongoid/extensions.rb +7 -11
- data/lib/mongoid/extensions/array/parentization.rb +2 -2
- data/lib/mongoid/extensions/date/conversions.rb +1 -1
- data/lib/mongoid/extensions/hash/conversions.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -0
- data/lib/mongoid/extensions/object/reflections.rb +17 -0
- data/lib/mongoid/extensions/object/yoda.rb +27 -0
- data/lib/mongoid/extensions/string/conversions.rb +23 -4
- data/lib/mongoid/extensions/time_conversions.rb +4 -4
- data/lib/mongoid/field.rb +30 -19
- data/lib/mongoid/fields.rb +15 -5
- data/lib/mongoid/finders.rb +19 -11
- data/lib/mongoid/hierarchy.rb +34 -28
- data/lib/mongoid/identity.rb +62 -20
- data/lib/mongoid/inspection.rb +58 -0
- data/lib/mongoid/matchers.rb +20 -0
- data/lib/mongoid/multi_database.rb +11 -0
- data/lib/mongoid/nested_attributes.rb +41 -0
- data/lib/mongoid/paranoia.rb +3 -4
- data/lib/mongoid/paths.rb +1 -1
- data/lib/mongoid/persistence.rb +89 -90
- data/lib/mongoid/persistence/command.rb +20 -4
- data/lib/mongoid/persistence/insert.rb +13 -11
- data/lib/mongoid/persistence/insert_embedded.rb +8 -6
- data/lib/mongoid/persistence/remove.rb +6 -4
- data/lib/mongoid/persistence/remove_all.rb +6 -4
- data/lib/mongoid/persistence/remove_embedded.rb +8 -6
- data/lib/mongoid/persistence/update.rb +12 -10
- data/lib/mongoid/railtie.rb +2 -2
- data/lib/mongoid/railties/database.rake +10 -9
- data/lib/mongoid/relations.rb +104 -0
- data/lib/mongoid/relations/accessors.rb +154 -0
- data/lib/mongoid/relations/auto_save.rb +34 -0
- data/lib/mongoid/relations/binding.rb +24 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +77 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +65 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +78 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +93 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +94 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +63 -0
- data/lib/mongoid/relations/builder.rb +41 -0
- data/lib/mongoid/relations/builders.rb +79 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +25 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +32 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +26 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +116 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +32 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +29 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +30 -0
- data/lib/mongoid/relations/cascading.rb +55 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +19 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/cyclic.rb +97 -0
- data/lib/mongoid/relations/embedded/in.rb +172 -0
- data/lib/mongoid/relations/embedded/many.rb +450 -0
- data/lib/mongoid/relations/embedded/one.rb +169 -0
- data/lib/mongoid/relations/macros.rb +302 -0
- data/lib/mongoid/relations/many.rb +185 -0
- data/lib/mongoid/relations/metadata.rb +529 -0
- data/lib/mongoid/relations/nested_builder.rb +52 -0
- data/lib/mongoid/relations/one.rb +29 -0
- data/lib/mongoid/relations/polymorphic.rb +54 -0
- data/lib/mongoid/relations/proxy.rb +122 -0
- data/lib/mongoid/relations/referenced/in.rb +214 -0
- data/lib/mongoid/relations/referenced/many.rb +358 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +379 -0
- data/lib/mongoid/relations/referenced/one.rb +204 -0
- data/lib/mongoid/relations/reflections.rb +45 -0
- data/lib/mongoid/safe.rb +11 -1
- data/lib/mongoid/safety.rb +122 -97
- data/lib/mongoid/scope.rb +14 -9
- data/lib/mongoid/state.rb +37 -3
- data/lib/mongoid/timestamps.rb +11 -0
- data/lib/mongoid/validations.rb +42 -3
- data/lib/mongoid/validations/associated.rb +8 -5
- data/lib/mongoid/validations/uniqueness.rb +23 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +25 -16
- data/lib/rails/generators/mongoid/model/templates/model.rb +3 -1
- metadata +95 -80
- data/lib/mongoid/associations.rb +0 -364
- data/lib/mongoid/associations/embedded_in.rb +0 -74
- data/lib/mongoid/associations/embeds_many.rb +0 -299
- data/lib/mongoid/associations/embeds_one.rb +0 -111
- data/lib/mongoid/associations/foreign_key.rb +0 -35
- data/lib/mongoid/associations/meta_data.rb +0 -38
- data/lib/mongoid/associations/options.rb +0 -78
- data/lib/mongoid/associations/proxy.rb +0 -60
- data/lib/mongoid/associations/referenced_in.rb +0 -70
- data/lib/mongoid/associations/references_many.rb +0 -254
- data/lib/mongoid/associations/references_many_as_array.rb +0 -128
- data/lib/mongoid/associations/references_one.rb +0 -104
- data/lib/mongoid/extensions/array/accessors.rb +0 -17
- data/lib/mongoid/extensions/array/assimilation.rb +0 -26
- data/lib/mongoid/extensions/hash/accessors.rb +0 -42
- data/lib/mongoid/extensions/hash/assimilation.rb +0 -40
- data/lib/mongoid/extensions/nil/assimilation.rb +0 -17
- data/lib/mongoid/memoization.rb +0 -33
data/lib/mongoid/identity.rb
CHANGED
@@ -1,47 +1,89 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
class Identity #:nodoc:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
#
|
4
|
+
|
5
|
+
attr_reader :document
|
6
|
+
|
7
|
+
# Create the identity for the document. The id will be set in either in
|
8
|
+
# the form of a Mongo object id or a composite key set up by defining
|
9
|
+
# a key on the document. The _type will be set to the document's class
|
10
|
+
# name.
|
8
11
|
#
|
9
|
-
#
|
12
|
+
# @example Create the id and set the type.
|
13
|
+
# identity.create
|
10
14
|
def create
|
11
|
-
identify
|
15
|
+
identify and type
|
12
16
|
end
|
13
17
|
|
14
18
|
# Create the new identity generator - this will be expanded in the future
|
15
19
|
# to support pk generators.
|
16
20
|
#
|
17
|
-
#
|
21
|
+
# @example
|
22
|
+
# Identity.new(document)
|
23
|
+
#
|
24
|
+
# @param [ Document ] document The document to generate an id for.
|
18
25
|
#
|
19
|
-
#
|
26
|
+
# @return [ Identity ] The new identity object.
|
20
27
|
def initialize(document)
|
21
28
|
@document = document
|
22
29
|
end
|
23
30
|
|
24
|
-
|
25
|
-
|
31
|
+
private
|
32
|
+
|
33
|
+
# Return the proper id for the document. Will be an object id or its string
|
34
|
+
# representation depending on the configuration.
|
35
|
+
#
|
36
|
+
# @example Generate the id.
|
37
|
+
# identity.generate_id
|
38
|
+
#
|
39
|
+
# @return [ Object ] The bson object id or its string equivalent.
|
26
40
|
def generate_id
|
27
41
|
id = BSON::ObjectId.new
|
28
|
-
|
42
|
+
document.using_object_ids? ? id : id.to_s
|
29
43
|
end
|
30
44
|
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
|
45
|
+
# Sets the id on the document. Will either set a newly generated id or
|
46
|
+
# build the composite key.
|
47
|
+
#
|
48
|
+
# @example Set the id.
|
49
|
+
# identity.identify
|
50
|
+
def identify
|
51
|
+
document.id = compose.join(" ").identify if document.primary_key
|
52
|
+
document.id = generate_id if document.id.blank?
|
35
53
|
end
|
36
54
|
|
37
|
-
# Set the _type field on the
|
38
|
-
|
39
|
-
|
55
|
+
# Set the _type field on the document if the document is hereditary or in a
|
56
|
+
# polymorphic relation.
|
57
|
+
#
|
58
|
+
# @example Set the type.
|
59
|
+
# identity.type
|
60
|
+
def type
|
61
|
+
document._type = document.class.name if typed?
|
40
62
|
end
|
41
63
|
|
42
|
-
# Generates the
|
64
|
+
# Generates the array of keys to build the id.
|
65
|
+
#
|
66
|
+
# @example Build the array for the keys.
|
67
|
+
# identity.compose.
|
68
|
+
#
|
69
|
+
# @return [ Array<Object> ] The array of keys.
|
43
70
|
def compose
|
44
|
-
|
71
|
+
document.primary_key.collect do |key|
|
72
|
+
document.attributes[key]
|
73
|
+
end.reject { |val| val.nil? }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Determines if the document stores the type information. This is if it is
|
77
|
+
# in a hierarchy, has subclasses, or is in a polymorphic relation.
|
78
|
+
#
|
79
|
+
# @example Check if the document is typed.
|
80
|
+
# identity.typed?
|
81
|
+
#
|
82
|
+
# @return [ true, false ] True if typed, false if not.
|
83
|
+
def typed?
|
84
|
+
document.hereditary? ||
|
85
|
+
document.class.descendants.any? ||
|
86
|
+
document.polymorphic?
|
45
87
|
end
|
46
88
|
end
|
47
89
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Inspection #:nodoc
|
4
|
+
|
5
|
+
# Returns the class name plus its attributes. If using dynamic fields will
|
6
|
+
# include those as well.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# <tt>person.inspect</tt>
|
11
|
+
#
|
12
|
+
# Returns:
|
13
|
+
#
|
14
|
+
# A nice pretty string to look at.
|
15
|
+
def inspect
|
16
|
+
inspection = []
|
17
|
+
inspection.concat(inspect_fields).concat(inspect_dynamic_fields)
|
18
|
+
"#<#{self.class.name} _id: #{id}, #{inspection * ', '}>"
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# Get an array of inspected fields for the document.
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
#
|
27
|
+
# <tt>inspect_fields</tt>
|
28
|
+
#
|
29
|
+
# Returns:
|
30
|
+
#
|
31
|
+
# An array of pretty printed field values.
|
32
|
+
def inspect_fields
|
33
|
+
fields.map do |name, field|
|
34
|
+
"#{name}: #{@attributes[name].inspect}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get an array of inspected dynamic fields for the document.
|
39
|
+
#
|
40
|
+
# Example:
|
41
|
+
#
|
42
|
+
# <tt>inspect_dynamic_fields</tt>
|
43
|
+
#
|
44
|
+
# Returns:
|
45
|
+
#
|
46
|
+
# An array of pretty printed dynamic field values.
|
47
|
+
def inspect_dynamic_fields
|
48
|
+
if Mongoid.allow_dynamic_fields
|
49
|
+
keys = @attributes.keys - fields.keys - relations.keys - ["_id", "_type"]
|
50
|
+
return keys.map do |name|
|
51
|
+
"#{name}: #{@attributes[name].inspect}"
|
52
|
+
end
|
53
|
+
else
|
54
|
+
[]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/mongoid/matchers.rb
CHANGED
@@ -12,9 +12,20 @@ require "mongoid/matchers/nin"
|
|
12
12
|
require "mongoid/matchers/size"
|
13
13
|
|
14
14
|
module Mongoid #:nodoc:
|
15
|
+
|
16
|
+
# This module contains all the behavior for ruby implementations of MongoDB
|
17
|
+
# selectors.
|
15
18
|
module Matchers
|
19
|
+
|
16
20
|
# Determines if this document has the attributes to match the supplied
|
17
21
|
# MongoDB selector. Used for matching on embedded associations.
|
22
|
+
#
|
23
|
+
# @example Does the document match?
|
24
|
+
# document.matches?(:title => { "$in" => [ "test" ] })
|
25
|
+
#
|
26
|
+
# @param [ Hash ] selector The MongoDB selector.
|
27
|
+
#
|
28
|
+
# @return [ true, false ] True if matches, false if not.
|
18
29
|
def matches?(selector)
|
19
30
|
selector.each_pair do |key, value|
|
20
31
|
return false unless matcher(key, value).matches?(value)
|
@@ -22,8 +33,17 @@ module Mongoid #:nodoc:
|
|
22
33
|
end
|
23
34
|
|
24
35
|
protected
|
36
|
+
|
25
37
|
# Get the matcher for the supplied key and value. Will determine the class
|
26
38
|
# name from the key.
|
39
|
+
#
|
40
|
+
# @example Get the matcher.
|
41
|
+
# document.matcher(:title, { "$in" => [ "test" ] })
|
42
|
+
#
|
43
|
+
# @param [ Symbol, String ] key The field name.
|
44
|
+
# @param [ Object, Hash ] The value or selector.
|
45
|
+
#
|
46
|
+
# @return [ Matcher ] The matcher.
|
27
47
|
def matcher(key, value)
|
28
48
|
if value.is_a?(Hash)
|
29
49
|
name = "Mongoid::Matchers::#{value.keys.first.gsub("$", "").camelize}"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module NestedAttributes
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
# Used when needing to update related models from a parent relation. Can
|
9
|
+
# be used on embedded or referenced relations.
|
10
|
+
#
|
11
|
+
# @example Defining nested attributes.
|
12
|
+
#
|
13
|
+
# class Person
|
14
|
+
# include Mongoid::Document
|
15
|
+
#
|
16
|
+
# embeds_many :addresses
|
17
|
+
# embeds_one :game
|
18
|
+
# references_many :posts
|
19
|
+
#
|
20
|
+
# accepts_nested_attributes_for :addresses, :game, :posts
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# @param [ Array<Symbol>, Hash ] *args A list of relation names, followed
|
24
|
+
# by a hash of options.
|
25
|
+
#
|
26
|
+
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
27
|
+
# @option *args [ Proc ] :reject_if Block to reject documents with.
|
28
|
+
# @option *args [ Integer ] :limit The max number to create.
|
29
|
+
# @option *args [ true, false ] :update_only Only update existing docs.
|
30
|
+
def accepts_nested_attributes_for(*args)
|
31
|
+
options = args.extract_options!
|
32
|
+
args.each do |name|
|
33
|
+
define_method("#{name}_attributes=") do |attrs|
|
34
|
+
relation = relations[name.to_s]
|
35
|
+
relation.nested_builder(attrs, options).build(self)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/mongoid/paranoia.rb
CHANGED
@@ -84,21 +84,20 @@ module Mongoid #:nodoc:
|
|
84
84
|
# Returns:
|
85
85
|
#
|
86
86
|
# A +Criteria+ for deleted_at not existing.
|
87
|
-
def criteria
|
87
|
+
def criteria(embedded = false)
|
88
88
|
super.where(:deleted_at.exists => false)
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# Find deleted documents
|
92
92
|
#
|
93
93
|
# Examples:
|
94
94
|
#
|
95
95
|
# <tt>Person.deleted</tt> # all deleted employees
|
96
96
|
# <tt>Company.first.employees.deleted</tt> # works with a join
|
97
|
-
# <tt>Person.deleted.find("4c188dea7b17235a2a000001").first</tt>
|
97
|
+
# <tt>Person.deleted.find("4c188dea7b17235a2a000001").first</tt>
|
98
98
|
def deleted
|
99
99
|
where(:deleted_at.exists => true)
|
100
100
|
end
|
101
|
-
|
102
101
|
end
|
103
102
|
end
|
104
103
|
end
|
data/lib/mongoid/paths.rb
CHANGED
@@ -35,7 +35,7 @@ module Mongoid #:nodoc:
|
|
35
35
|
# <tt>address.position</tt>
|
36
36
|
def _position
|
37
37
|
locator = _index ? (new_record? ? "" : ".#{_index}") : ""
|
38
|
-
embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{
|
38
|
+
embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{metadata.name.to_s}#{locator}" : ""
|
39
39
|
end
|
40
40
|
|
41
41
|
# Get the removal modifier for the document. Will be nil on root
|
data/lib/mongoid/persistence.rb
CHANGED
@@ -8,116 +8,121 @@ require "mongoid/persistence/remove_embedded"
|
|
8
8
|
require "mongoid/persistence/update"
|
9
9
|
|
10
10
|
module Mongoid #:nodoc:
|
11
|
+
|
11
12
|
# The persistence module is a mixin to provide database accessor methods for
|
12
13
|
# the document. These correspond to the appropriate accessors on a
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# Examples:
|
14
|
+
# mongo collection and retain the same DSL.
|
16
15
|
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
16
|
+
# @example Sample persistence operations.
|
17
|
+
# document.insert
|
18
|
+
# document.update
|
19
|
+
# document.upsert
|
20
20
|
module Persistence
|
21
21
|
extend ActiveSupport::Concern
|
22
22
|
|
23
|
-
# Remove the
|
23
|
+
# Remove the document from the datbase with callbacks.
|
24
|
+
#
|
25
|
+
# @example Destroy a document.
|
26
|
+
# document.destroy
|
24
27
|
#
|
25
|
-
#
|
28
|
+
# @param [ Hash ] options Options to pass to destroy.
|
26
29
|
#
|
27
|
-
#
|
30
|
+
# @return [ true, false ] True if successful, false if not.
|
28
31
|
def destroy(options = {})
|
29
|
-
run_callbacks(:destroy) {
|
32
|
+
run_callbacks(:destroy) { remove(options) }
|
30
33
|
end
|
31
34
|
|
32
|
-
# Insert a new
|
35
|
+
# Insert a new document into the database. Will return the document
|
33
36
|
# itself whether or not the save was successful.
|
34
37
|
#
|
35
|
-
#
|
38
|
+
# @example Insert a document.
|
39
|
+
# document.insert
|
36
40
|
#
|
37
|
-
#
|
41
|
+
# @param [ Hash ] options Options to pass to insert.
|
42
|
+
#
|
43
|
+
# @return [ Document ] The persisted document.
|
38
44
|
def insert(options = {})
|
39
45
|
Insert.new(self, options).persist
|
40
46
|
end
|
41
47
|
|
42
|
-
# Remove the
|
48
|
+
# Remove the document from the datbase.
|
43
49
|
#
|
44
|
-
#
|
50
|
+
# @example Remove the document.
|
51
|
+
# document.remove
|
45
52
|
#
|
46
|
-
#
|
53
|
+
# @param [ Hash ] options Options to pass to remove.
|
47
54
|
#
|
48
|
-
#
|
49
|
-
def
|
55
|
+
# @return [ TrueClass ] True.
|
56
|
+
def remove(options = {})
|
50
57
|
if Remove.new(self, options).persist
|
51
58
|
self.destroyed = true
|
52
|
-
|
59
|
+
cascade!
|
53
60
|
end; true
|
54
61
|
end
|
55
|
-
|
56
|
-
alias :delete :_remove
|
62
|
+
alias :delete :remove
|
57
63
|
|
58
64
|
# Save the document - will perform an insert if the document is new, and
|
59
|
-
# update if not. If a validation error occurs
|
60
|
-
# Mongoid::Errors::Validations error will get raised.
|
61
|
-
#
|
62
|
-
# Example:
|
65
|
+
# update if not. If a validation error occurs an error will get raised.
|
63
66
|
#
|
64
|
-
#
|
67
|
+
# @example Save the document.
|
68
|
+
# document.save!
|
65
69
|
#
|
66
|
-
#
|
70
|
+
# @param [ Hash ] options Options to pass to the save.
|
67
71
|
#
|
68
|
-
#
|
72
|
+
# @return [ true, false ] True if validation passed.
|
69
73
|
def save!(options = {})
|
70
74
|
self.class.fail_validate!(self) unless upsert; true
|
71
75
|
end
|
72
76
|
|
73
|
-
# Update the
|
77
|
+
# Update the document in the datbase.
|
74
78
|
#
|
75
|
-
#
|
79
|
+
# @example Update an existing document.
|
80
|
+
# document.update
|
76
81
|
#
|
77
|
-
#
|
82
|
+
# @param [ Hash ] options Options to pass to update.
|
83
|
+
#
|
84
|
+
# @return [ true, false ] True if succeeded, false if not.
|
78
85
|
def update(options = {})
|
79
86
|
Update.new(self, options).persist
|
80
87
|
end
|
81
88
|
|
82
|
-
# Update the
|
83
|
-
#
|
84
|
-
# Example:
|
89
|
+
# Update the document attributes in the datbase.
|
85
90
|
#
|
86
|
-
#
|
91
|
+
# @example Update the document's attributes
|
92
|
+
# document.update_attributes(:title => "Sir")
|
87
93
|
#
|
88
|
-
#
|
94
|
+
# @param [ Hash ] attributes The attributes to update.
|
89
95
|
#
|
90
|
-
#
|
96
|
+
# @return [ true, false ] True if validation passed, false if not.
|
91
97
|
def update_attributes(attributes = {})
|
92
98
|
write_attributes(attributes); update
|
93
99
|
end
|
94
100
|
|
95
|
-
# Update the
|
96
|
-
#
|
97
|
-
# Example:
|
101
|
+
# Update the document attributes in the database and raise an error if
|
102
|
+
# validation failed.
|
98
103
|
#
|
99
|
-
#
|
104
|
+
# @example Update the document's attributes.
|
105
|
+
# document.update_attributes(:title => "Sir")
|
100
106
|
#
|
101
|
-
#
|
107
|
+
# @param [ Hash ] attributes The attributes to update.
|
102
108
|
#
|
103
|
-
#
|
109
|
+
# @return [ true, false ] True if validation passed.
|
104
110
|
def update_attributes!(attributes = {})
|
105
111
|
write_attributes(attributes)
|
106
|
-
|
107
|
-
|
108
|
-
|
112
|
+
update.tap do |result|
|
113
|
+
self.class.fail_validate!(self) unless result
|
114
|
+
end
|
109
115
|
end
|
110
116
|
|
111
117
|
# Upsert the document - will perform an insert if the document is new, and
|
112
118
|
# update if not.
|
113
119
|
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
# <tt>document.upsert</tt>
|
120
|
+
# @example Upsert the document.
|
121
|
+
# document.upsert
|
117
122
|
#
|
118
|
-
#
|
123
|
+
# @param [ Hash ] options Options to pass to the upsert.
|
119
124
|
#
|
120
|
-
#
|
125
|
+
# @return [ true, false ] True is success, false if not.
|
121
126
|
def upsert(options = {})
|
122
127
|
if new_record?
|
123
128
|
insert(options).persisted?
|
@@ -125,53 +130,35 @@ module Mongoid #:nodoc:
|
|
125
130
|
update(options)
|
126
131
|
end
|
127
132
|
end
|
128
|
-
|
129
|
-
# Save is aliased so that users familiar with active record can have some
|
130
|
-
# semblance of a familiar API.
|
131
|
-
#
|
132
|
-
# Example:
|
133
|
-
#
|
134
|
-
# <tt>document.save</tt>
|
135
133
|
alias :save :upsert
|
136
134
|
|
137
|
-
protected
|
138
|
-
|
139
|
-
# Perform all cascading deletes or destroys.
|
140
|
-
def cascading_remove!
|
141
|
-
cascades.each do |name, option|
|
142
|
-
association = send(name)
|
143
|
-
if association
|
144
|
-
documents = association.target.to_a
|
145
|
-
documents.each { |doc| doc.send(option) }
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
135
|
module ClassMethods #:nodoc:
|
151
136
|
|
152
|
-
# Create a new
|
137
|
+
# Create a new document. This will instantiate a new document and
|
153
138
|
# insert it in a single call. Will always return the document
|
154
139
|
# whether save passed or not.
|
155
140
|
#
|
156
|
-
#
|
141
|
+
# @example Create a new document.
|
142
|
+
# Person.create(:title => "Mr")
|
157
143
|
#
|
158
|
-
#
|
144
|
+
# @param [ Hash ] attributes The attributes to create with.
|
159
145
|
#
|
160
|
-
#
|
146
|
+
# @return [ Document ] The newly created document.
|
161
147
|
def create(attributes = {})
|
162
|
-
new(attributes).tap(&:
|
148
|
+
new(attributes).tap(&:save)
|
163
149
|
end
|
164
150
|
|
165
|
-
# Create a new
|
151
|
+
# Create a new document. This will instantiate a new document and
|
166
152
|
# insert it in a single call. Will always return the document
|
167
153
|
# whether save passed or not, and if validation fails an error will be
|
168
154
|
# raise.
|
169
155
|
#
|
170
|
-
#
|
156
|
+
# @example Create a new document.
|
157
|
+
# Person.create!(:title => "Mr")
|
171
158
|
#
|
172
|
-
#
|
159
|
+
# @param [ Hash ] attributes The attributes to create with.
|
173
160
|
#
|
174
|
-
#
|
161
|
+
# @return [ Document ] The newly created document.
|
175
162
|
def create!(attributes = {})
|
176
163
|
document = new(attributes)
|
177
164
|
fail_validate!(document) if document.insert.errors.any?
|
@@ -182,12 +169,15 @@ module Mongoid #:nodoc:
|
|
182
169
|
# are passed, the entire collection will be dropped for performance
|
183
170
|
# benefits. Does not fire any callbacks.
|
184
171
|
#
|
185
|
-
#
|
172
|
+
# @example Delete matching documents from the collection.
|
173
|
+
# Person.delete_all(:conditions => { :title => "Sir" })
|
174
|
+
#
|
175
|
+
# @example Delete all documents from the collection.
|
176
|
+
# Person.delete_all
|
186
177
|
#
|
187
|
-
#
|
188
|
-
# <tt>Person.delete_all</tt>
|
178
|
+
# @param [ Hash ] conditions Optional conditions to delete by.
|
189
179
|
#
|
190
|
-
#
|
180
|
+
# @return [ Integer ] The number of documents deleted.
|
191
181
|
def delete_all(conditions = {})
|
192
182
|
RemoveAll.new(
|
193
183
|
self,
|
@@ -200,19 +190,28 @@ module Mongoid #:nodoc:
|
|
200
190
|
# are passed, the entire collection will be dropped for performance
|
201
191
|
# benefits. Fires the destroy callbacks if conditions were passed.
|
202
192
|
#
|
203
|
-
#
|
193
|
+
# @example Destroy matching documents from the collection.
|
194
|
+
# Person.destroy_all(:conditions => { :title => "Sir" })
|
195
|
+
#
|
196
|
+
# @example Destroy all documents from the collection.
|
197
|
+
# Person.destroy_all
|
204
198
|
#
|
205
|
-
#
|
206
|
-
# <tt>Person.destroy_all</tt>
|
199
|
+
# @param [ Hash ] conditions Optional conditions to destroy by.
|
207
200
|
#
|
208
|
-
#
|
201
|
+
# @return [ Integer ] The number of documents destroyed.
|
209
202
|
def destroy_all(conditions = {})
|
210
203
|
documents = all(conditions)
|
211
|
-
|
212
|
-
|
204
|
+
documents.count.tap do
|
205
|
+
documents.each { |doc| doc.destroy }
|
206
|
+
end
|
213
207
|
end
|
214
208
|
|
215
209
|
# Raise an error if validation failed.
|
210
|
+
#
|
211
|
+
# @example Raise the validation error.
|
212
|
+
# Person.fail_validate!(person)
|
213
|
+
#
|
214
|
+
# @param [ Document ] document The document to fail.
|
216
215
|
def fail_validate!(document)
|
217
216
|
raise Errors::Validations.new(document)
|
218
217
|
end
|