mongoid-rails2 1.9.3
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/MIT_LICENSE +20 -0
- data/README.rdoc +49 -0
- data/lib/mongoid/associations/belongs_to_related.rb +58 -0
- data/lib/mongoid/associations/embedded_in.rb +72 -0
- data/lib/mongoid/associations/embeds_many.rb +254 -0
- data/lib/mongoid/associations/embeds_one.rb +96 -0
- data/lib/mongoid/associations/has_many_related.rb +181 -0
- data/lib/mongoid/associations/has_one_related.rb +85 -0
- data/lib/mongoid/associations/meta_data.rb +29 -0
- data/lib/mongoid/associations/options.rb +57 -0
- data/lib/mongoid/associations/proxy.rb +24 -0
- data/lib/mongoid/associations.rb +300 -0
- data/lib/mongoid/attributes.rb +204 -0
- data/lib/mongoid/callbacks.rb +23 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +29 -0
- data/lib/mongoid/collections/operations.rb +41 -0
- data/lib/mongoid/collections/slaves.rb +45 -0
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/components.rb +27 -0
- data/lib/mongoid/concern.rb +31 -0
- data/lib/mongoid/config.rb +191 -0
- data/lib/mongoid/contexts/enumerable.rb +151 -0
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +285 -0
- data/lib/mongoid/contexts/paging.rb +50 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/criteria.rb +249 -0
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +65 -0
- data/lib/mongoid/criterion/inclusion.rb +110 -0
- data/lib/mongoid/criterion/optional.rb +136 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +22 -0
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +311 -0
- data/lib/mongoid/errors.rb +108 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/aliasing.rb +4 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -0
- data/lib/mongoid/extensions/array/conversions.rb +29 -0
- data/lib/mongoid/extensions/array/parentization.rb +13 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/extensions/boolean/conversions.rb +22 -0
- data/lib/mongoid/extensions/date/conversions.rb +24 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/accessors.rb +38 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +39 -0
- data/lib/mongoid/extensions/hash/conversions.rb +45 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
- data/lib/mongoid/extensions/object/conversions.rb +33 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/string/conversions.rb +15 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extensions.rb +101 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +59 -0
- data/lib/mongoid/fields.rb +65 -0
- data/lib/mongoid/finders.rb +144 -0
- data/lib/mongoid/identity.rb +39 -0
- data/lib/mongoid/indexes.rb +30 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +26 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/matchers.rb +36 -0
- data/lib/mongoid/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/observable.rb +30 -0
- data/lib/mongoid/paths.rb +62 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +50 -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/persistence.rb +222 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +39 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +27 -0
- data/lib/mongoid.rb +122 -0
- metadata +298 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "mongoid/matchers/default"
|
|
3
|
+
require "mongoid/matchers/all"
|
|
4
|
+
require "mongoid/matchers/exists"
|
|
5
|
+
require "mongoid/matchers/gt"
|
|
6
|
+
require "mongoid/matchers/gte"
|
|
7
|
+
require "mongoid/matchers/in"
|
|
8
|
+
require "mongoid/matchers/lt"
|
|
9
|
+
require "mongoid/matchers/lte"
|
|
10
|
+
require "mongoid/matchers/ne"
|
|
11
|
+
require "mongoid/matchers/nin"
|
|
12
|
+
require "mongoid/matchers/size"
|
|
13
|
+
|
|
14
|
+
module Mongoid #:nodoc:
|
|
15
|
+
module Matchers
|
|
16
|
+
# Determines if this document has the attributes to match the supplied
|
|
17
|
+
# MongoDB selector. Used for matching on embedded associations.
|
|
18
|
+
def matches?(selector)
|
|
19
|
+
selector.each_pair do |key, value|
|
|
20
|
+
return false unless matcher(key, value).matches?(value)
|
|
21
|
+
end
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
# Get the matcher for the supplied key and value. Will determine the class
|
|
27
|
+
# name from the key.
|
|
28
|
+
def matcher(key, value)
|
|
29
|
+
if value.is_a?(Hash)
|
|
30
|
+
name = "Mongoid::Matchers::#{value.keys.first.gsub("$", "").camelize}"
|
|
31
|
+
return name.constantize.new(attributes[key])
|
|
32
|
+
end
|
|
33
|
+
Default.new(attributes[key])
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Mongoid #:nodoc
|
|
2
|
+
module Memoization
|
|
3
|
+
|
|
4
|
+
# Handles cases when accessing an association that should be memoized in
|
|
5
|
+
# the Mongoid specific manner. Does not memoize nil values though
|
|
6
|
+
def memoized(name, &block)
|
|
7
|
+
var = "@#{name}"
|
|
8
|
+
if instance_variable_defined?(var)
|
|
9
|
+
return instance_variable_get(var)
|
|
10
|
+
end
|
|
11
|
+
value = yield
|
|
12
|
+
instance_variable_set(var, value) if value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Removes an memozied association if it exists
|
|
16
|
+
def unmemoize(name)
|
|
17
|
+
var = "@#{name}"
|
|
18
|
+
remove_instance_variable(var) if instance_variable_defined?(var)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Mongoid specific behavior is to remove the memoized object when setting
|
|
22
|
+
# the association, or if it wasn't previously memoized it will get set.
|
|
23
|
+
def reset(name, &block)
|
|
24
|
+
var = "@#{name}"
|
|
25
|
+
value = yield
|
|
26
|
+
if instance_variable_defined?(var)
|
|
27
|
+
remove_instance_variable(var)
|
|
28
|
+
else
|
|
29
|
+
instance_variable_set(var, value)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module NamedScope
|
|
4
|
+
# Creates a named_scope for the +Document+, similar to ActiveRecord's
|
|
5
|
+
# named_scopes. +NamedScopes+ are proxied +Criteria+ objects that can be
|
|
6
|
+
# chained.
|
|
7
|
+
#
|
|
8
|
+
# Example:
|
|
9
|
+
#
|
|
10
|
+
# class Person
|
|
11
|
+
# include Mongoid::Document
|
|
12
|
+
# field :active, :type => Boolean
|
|
13
|
+
# field :count, :type => Integer
|
|
14
|
+
#
|
|
15
|
+
# named_scope :active, :where => { :active => true }
|
|
16
|
+
# named_scope :count_gt_one, :where => { :count.gt => 1 }
|
|
17
|
+
# named_scope :at_least_count, lambda { |count| { :where => { :count.gt => count } } }
|
|
18
|
+
# end
|
|
19
|
+
def named_scope(name, options = {}, &block)
|
|
20
|
+
name = name.to_sym
|
|
21
|
+
scopes[name] = lambda do |parent, *args|
|
|
22
|
+
Scope.new(parent, options.scoped(*args), &block)
|
|
23
|
+
end
|
|
24
|
+
(class << self; self; end).class_eval <<-EOT
|
|
25
|
+
def #{name}(*args)
|
|
26
|
+
scopes[:#{name}].call(self, *args)
|
|
27
|
+
end
|
|
28
|
+
EOT
|
|
29
|
+
end
|
|
30
|
+
alias :scope :named_scope
|
|
31
|
+
|
|
32
|
+
# Return the scopes or default to an empty +Hash+.
|
|
33
|
+
def scopes
|
|
34
|
+
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Observable #:nodoc:
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
attr_reader :observers
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Add an observer to this object. This mimics the standard Ruby observable
|
|
10
|
+
# library.
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
#
|
|
14
|
+
# <tt>address.add_observer(person)</tt>
|
|
15
|
+
def add_observer(object)
|
|
16
|
+
@observers ||= []
|
|
17
|
+
@observers.push(object)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Notify all the objects observing this object of an update. All observers
|
|
21
|
+
# need to respond to the update method in order to handle this.
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# <tt>document.notify_observers(self)</tt>
|
|
26
|
+
def notify_observers(*args)
|
|
27
|
+
@observers.dup.each { |observer| observer.observe(*args) } if @observers
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Paths #:nodoc:
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
attr_accessor :__path
|
|
7
|
+
attr_accessor :_index
|
|
8
|
+
end
|
|
9
|
+
module InstanceMethods
|
|
10
|
+
# Get the insertion modifier for the document. Will be nil on root
|
|
11
|
+
# documents, $set on embeds_one, $push on embeds_many.
|
|
12
|
+
#
|
|
13
|
+
# Example:
|
|
14
|
+
#
|
|
15
|
+
# <tt>name.inserter</tt>
|
|
16
|
+
def _inserter
|
|
17
|
+
embedded? ? (embedded_many? ? "$push" : "$set") : nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Return the path to this +Document+ in JSON notation, used for atomic
|
|
21
|
+
# updates via $set in MongoDB.
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# <tt>address.path # returns "addresses"</tt>
|
|
26
|
+
def _path
|
|
27
|
+
_position.sub!(/\.\d+$/, '') || _position
|
|
28
|
+
end
|
|
29
|
+
alias :_pull :_path
|
|
30
|
+
|
|
31
|
+
# Returns the positional operator of this document for modification.
|
|
32
|
+
#
|
|
33
|
+
# Example:
|
|
34
|
+
#
|
|
35
|
+
# <tt>address.position</tt>
|
|
36
|
+
def _position
|
|
37
|
+
locator = _index ? (new_record? ? "" : ".#{_index}") : ""
|
|
38
|
+
embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{@association_name}#{locator}" : ""
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Get the removal modifier for the document. Will be nil on root
|
|
42
|
+
# documents, $unset on embeds_one, $set on embeds_many.
|
|
43
|
+
#
|
|
44
|
+
# Example:
|
|
45
|
+
#
|
|
46
|
+
# <tt>name.remover</tt>
|
|
47
|
+
def _remover
|
|
48
|
+
embedded? ? (_index ? "$pull" : "$unset") : nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Return the selector for this document to be matched exactly for use
|
|
52
|
+
# with MongoDB's $ operator.
|
|
53
|
+
#
|
|
54
|
+
# Example:
|
|
55
|
+
#
|
|
56
|
+
# <tt>address.selector</tt>
|
|
57
|
+
def _selector
|
|
58
|
+
embedded? ? _parent._selector.merge("#{_path}._id" => id) : { "_id" => id }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
# Persistence commands extend from this class to get basic functionality on
|
|
5
|
+
# initialization.
|
|
6
|
+
class Command
|
|
7
|
+
attr_reader \
|
|
8
|
+
:collection,
|
|
9
|
+
:document,
|
|
10
|
+
:klass,
|
|
11
|
+
:options,
|
|
12
|
+
:selector,
|
|
13
|
+
:validate
|
|
14
|
+
|
|
15
|
+
# Initialize the persistence +Command+.
|
|
16
|
+
#
|
|
17
|
+
# Options:
|
|
18
|
+
#
|
|
19
|
+
# document_or_class: The +Document+ or +Class+ to get the collection.
|
|
20
|
+
# validate: Is the document to be validated.
|
|
21
|
+
# selector: Optional selector to use in query.
|
|
22
|
+
#
|
|
23
|
+
# Example:
|
|
24
|
+
#
|
|
25
|
+
# <tt>DeleteAll.new(Person, false, {})</tt>
|
|
26
|
+
def initialize(document_or_class, validate = true, selector = {})
|
|
27
|
+
if document_or_class.is_a?(Mongoid::Document)
|
|
28
|
+
@document = document_or_class
|
|
29
|
+
@collection = @document.embedded? ? @document._root.collection : @document.collection
|
|
30
|
+
else
|
|
31
|
+
@klass = document_or_class
|
|
32
|
+
@collection = @klass.collection
|
|
33
|
+
end
|
|
34
|
+
@selector, @validate = selector, validate
|
|
35
|
+
@options = { :safe => Mongoid.persist_in_safe_mode }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
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.
|
|
6
|
+
#
|
|
7
|
+
# The underlying query resembles the following MongoDB query:
|
|
8
|
+
#
|
|
9
|
+
# collection.insert(
|
|
10
|
+
# { "_id" : 1, "field" : "value" },
|
|
11
|
+
# false
|
|
12
|
+
# );
|
|
13
|
+
class Insert < Command
|
|
14
|
+
# Insert the new document in the database. This delegates to the standard
|
|
15
|
+
# MongoDB collection's insert command.
|
|
16
|
+
#
|
|
17
|
+
# Example:
|
|
18
|
+
#
|
|
19
|
+
# <tt>Insert.persist</tt>
|
|
20
|
+
#
|
|
21
|
+
# Returns:
|
|
22
|
+
#
|
|
23
|
+
# The +Document+, whether the insert succeeded or not.
|
|
24
|
+
def persist
|
|
25
|
+
return @document if @validate && !@document.valid?
|
|
26
|
+
@document.run_callbacks(:before_create)
|
|
27
|
+
@document.run_callbacks(:before_save)
|
|
28
|
+
if insert
|
|
29
|
+
@document.new_record = false
|
|
30
|
+
# TODO: All child document new_record flags must get set to false
|
|
31
|
+
# here or somewhere - this will cause problems.
|
|
32
|
+
@document.move_changes
|
|
33
|
+
@document.run_callbacks(:after_create)
|
|
34
|
+
@document.run_callbacks(:after_save)
|
|
35
|
+
end
|
|
36
|
+
@document
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
# Insert the document into the database.
|
|
41
|
+
def insert
|
|
42
|
+
if @document.embedded?
|
|
43
|
+
Persistence::InsertEmbedded.new(@document, @validate).persist
|
|
44
|
+
else
|
|
45
|
+
@collection.insert(@document.raw_attributes, @options)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -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(:before_save)
|
|
44
|
+
@document.run_callbacks(:before_update)
|
|
45
|
+
if update
|
|
46
|
+
@document.move_changes
|
|
47
|
+
@document.run_callbacks(:after_save)
|
|
48
|
+
@document.run_callbacks(:after_update)
|
|
49
|
+
else
|
|
50
|
+
return false
|
|
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
|