mongoid 1.9.5 → 2.0.0.alpha
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/.gitignore +6 -0
- data/.watchr +29 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/caliper.yml +4 -0
- data/lib/mongoid.rb +20 -9
- data/lib/mongoid/associations.rb +100 -123
- data/lib/mongoid/associations/belongs_to_related.rb +3 -2
- data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
- data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
- data/lib/mongoid/associations/embedded_in.rb +4 -12
- data/lib/mongoid/associations/has_many_related.rb +4 -52
- data/lib/mongoid/associations/has_one_related.rb +4 -8
- data/lib/mongoid/associations/meta_data.rb +1 -2
- data/lib/mongoid/associations/options.rb +1 -6
- data/lib/mongoid/associations/proxy.rb +21 -14
- data/lib/mongoid/attributes.rb +13 -33
- data/lib/mongoid/callbacks.rb +11 -16
- data/lib/mongoid/collection.rb +3 -4
- data/lib/mongoid/collections/master.rb +2 -3
- data/lib/mongoid/collections/mimic.rb +46 -0
- data/lib/mongoid/collections/slaves.rb +2 -3
- data/lib/mongoid/commands.rb +161 -0
- data/lib/mongoid/commands/create.rb +19 -0
- data/lib/mongoid/commands/delete.rb +16 -0
- data/lib/mongoid/commands/delete_all.rb +23 -0
- data/lib/mongoid/commands/deletion.rb +18 -0
- data/lib/mongoid/commands/destroy.rb +17 -0
- data/lib/mongoid/commands/destroy_all.rb +23 -0
- data/lib/mongoid/commands/save.rb +29 -0
- data/lib/mongoid/components.rb +6 -4
- data/lib/mongoid/config.rb +15 -134
- data/lib/mongoid/contexts.rb +1 -1
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +2 -10
- data/lib/mongoid/criterion/inclusion.rb +0 -17
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/cursor.rb +1 -0
- data/lib/mongoid/document.rb +45 -49
- data/lib/mongoid/errors.rb +1 -32
- data/lib/mongoid/extensions.rb +10 -12
- data/lib/mongoid/extensions/array/conversions.rb +6 -8
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
- data/lib/mongoid/extensions/date/conversions.rb +4 -13
- data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
- data/lib/mongoid/extensions/float/conversions.rb +1 -5
- data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
- data/lib/mongoid/extensions/hash/conversions.rb +4 -34
- data/lib/mongoid/extensions/integer/conversions.rb +1 -5
- data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
- data/lib/mongoid/extensions/object/conversions.rb +2 -8
- data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
- data/lib/mongoid/extensions/time/conversions.rb +18 -0
- data/lib/mongoid/factory.rb +1 -2
- data/lib/mongoid/field.rb +2 -9
- data/lib/mongoid/fields.rb +7 -11
- data/lib/mongoid/finders.rb +2 -2
- data/lib/mongoid/identity.rb +4 -4
- data/lib/mongoid/indexes.rb +7 -10
- data/lib/mongoid/memoization.rb +2 -8
- data/lib/mongoid/named_scope.rb +5 -0
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +22 -30
- data/lib/mongoid/state.rb +21 -28
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +4 -0
- data/lib/mongoid/validations/uniqueness.rb +22 -0
- data/lib/mongoid/versioning.rb +1 -2
- data/mongoid.gemspec +408 -0
- data/perf/benchmark.rb +77 -0
- data/spec/integration/mongoid/associations_spec.rb +340 -0
- data/spec/integration/mongoid/attributes_spec.rb +22 -0
- data/spec/integration/mongoid/commands_spec.rb +227 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +272 -0
- data/spec/integration/mongoid/document_spec.rb +650 -0
- data/spec/integration/mongoid/extensions_spec.rb +22 -0
- data/spec/integration/mongoid/finders_spec.rb +119 -0
- data/spec/integration/mongoid/inheritance_spec.rb +137 -0
- data/spec/integration/mongoid/named_scope_spec.rb +46 -0
- data/spec/models/address.rb +39 -0
- data/spec/models/animal.rb +6 -0
- data/spec/models/callbacks.rb +18 -0
- data/spec/models/comment.rb +8 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/game.rb +7 -0
- data/spec/models/inheritance.rb +56 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/patient.rb +4 -0
- data/spec/models/person.rb +99 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +15 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
- data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
- data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
- data/spec/unit/mongoid/associations/options_spec.rb +192 -0
- data/spec/unit/mongoid/associations_spec.rb +595 -0
- data/spec/unit/mongoid/attributes_spec.rb +507 -0
- data/spec/unit/mongoid/callbacks_spec.rb +55 -0
- data/spec/unit/mongoid/collection_spec.rb +187 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/commands/create_spec.rb +31 -0
- data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
- data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
- data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
- data/spec/unit/mongoid/commands/save_spec.rb +107 -0
- data/spec/unit/mongoid/commands_spec.rb +270 -0
- data/spec/unit/mongoid/config_spec.rb +172 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +824 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
- data/spec/unit/mongoid/cursor_spec.rb +74 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/document_spec.rb +818 -0
- data/spec/unit/mongoid/errors_spec.rb +103 -0
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
- data/spec/unit/mongoid/extras_spec.rb +102 -0
- data/spec/unit/mongoid/factory_spec.rb +31 -0
- data/spec/unit/mongoid/field_spec.rb +143 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +404 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +93 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/memoization_spec.rb +75 -0
- data/spec/unit/mongoid/named_scope_spec.rb +123 -0
- data/spec/unit/mongoid/observable_spec.rb +46 -0
- data/spec/unit/mongoid/paths_spec.rb +124 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/state_spec.rb +83 -0
- data/spec/unit/mongoid/timestamps_spec.rb +25 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
- data/spec/unit/mongoid/validations_spec.rb +190 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +316 -110
- data/lib/mongoid/collections.rb +0 -41
- data/lib/mongoid/concern.rb +0 -31
- data/lib/mongoid/dirty.rb +0 -253
- data/lib/mongoid/extensions/time_conversions.rb +0 -35
- data/lib/mongoid/persistence.rb +0 -222
- data/lib/mongoid/persistence/command.rb +0 -39
- data/lib/mongoid/persistence/insert.rb +0 -50
- data/lib/mongoid/persistence/insert_embedded.rb +0 -38
- data/lib/mongoid/persistence/remove.rb +0 -39
- data/lib/mongoid/persistence/remove_all.rb +0 -37
- data/lib/mongoid/persistence/remove_embedded.rb +0 -50
- data/lib/mongoid/persistence/update.rb +0 -63
- data/lib/mongoid/version.rb +0 -4
data/lib/mongoid/collections.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc
|
3
|
-
# The collections module is used for providing functionality around setting
|
4
|
-
# up and updating collections.
|
5
|
-
module Collections
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
included do
|
8
|
-
cattr_accessor :_collection, :collection_name
|
9
|
-
self.collection_name = self.name.collectionize
|
10
|
-
delegate :collection, :to => "self.class"
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods #:nodoc:
|
14
|
-
# Returns the collection associated with this +Document+. If the
|
15
|
-
# document is embedded, there will be no collection associated
|
16
|
-
# with it.
|
17
|
-
#
|
18
|
-
# Returns: <tt>Mongo::Collection</tt>
|
19
|
-
def collection
|
20
|
-
raise Errors::InvalidCollection.new(self) if embedded?
|
21
|
-
self._collection || set_collection
|
22
|
-
add_indexes; self._collection
|
23
|
-
end
|
24
|
-
|
25
|
-
# Macro for setting the collection name to store in.
|
26
|
-
#
|
27
|
-
# Example:
|
28
|
-
#
|
29
|
-
# <tt>Person.store_in :populdation</tt>
|
30
|
-
def store_in(name)
|
31
|
-
self.collection_name = name.to_s
|
32
|
-
set_collection
|
33
|
-
end
|
34
|
-
|
35
|
-
protected
|
36
|
-
def set_collection
|
37
|
-
self._collection = Mongoid::Collection.new(self, self.collection_name)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/mongoid/concern.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
unless defined?(ActiveSupport::Concern)
|
2
|
-
module ActiveSupport
|
3
|
-
module Concern
|
4
|
-
def self.extended(base)
|
5
|
-
base.instance_variable_set("@_dependencies", [])
|
6
|
-
end
|
7
|
-
|
8
|
-
def append_features(base)
|
9
|
-
if base.instance_variable_defined?("@_dependencies")
|
10
|
-
base.instance_variable_get("@_dependencies") << self
|
11
|
-
return false
|
12
|
-
else
|
13
|
-
return false if base < self
|
14
|
-
@_dependencies.each { |dep| base.send(:include, dep) }
|
15
|
-
super
|
16
|
-
base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
|
17
|
-
base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
|
18
|
-
base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def included(base = nil, &block)
|
23
|
-
if base.nil?
|
24
|
-
@_included_block = block
|
25
|
-
else
|
26
|
-
super
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/mongoid/dirty.rb
DELETED
@@ -1,253 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Dirty #:nodoc:
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
module InstanceMethods #:nodoc:
|
6
|
-
# Gets the changes for a specific field.
|
7
|
-
#
|
8
|
-
# Example:
|
9
|
-
#
|
10
|
-
# person = Person.new(:title => "Sir")
|
11
|
-
# person.title = "Madam"
|
12
|
-
# person.attribute_change("title") # [ "Sir", "Madam" ]
|
13
|
-
#
|
14
|
-
# Returns:
|
15
|
-
#
|
16
|
-
# An +Array+ containing the old and new values.
|
17
|
-
def attribute_change(name)
|
18
|
-
modifications[name]
|
19
|
-
end
|
20
|
-
|
21
|
-
# Determines if a specific field has chaged.
|
22
|
-
#
|
23
|
-
# Example:
|
24
|
-
#
|
25
|
-
# person = Person.new(:title => "Sir")
|
26
|
-
# person.title = "Madam"
|
27
|
-
# person.attribute_changed?("title") # true
|
28
|
-
#
|
29
|
-
# Returns:
|
30
|
-
#
|
31
|
-
# +true+ if changed, +false+ if not.
|
32
|
-
def attribute_changed?(name)
|
33
|
-
modifications.include?(name)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Gets the old value for a specific field.
|
37
|
-
#
|
38
|
-
# Example:
|
39
|
-
#
|
40
|
-
# person = Person.new(:title => "Sir")
|
41
|
-
# person.title = "Madam"
|
42
|
-
# person.attribute_was("title") # "Sir"
|
43
|
-
#
|
44
|
-
# Returns:
|
45
|
-
#
|
46
|
-
# The old field value.
|
47
|
-
def attribute_was(name)
|
48
|
-
change = modifications[name]
|
49
|
-
change ? change[0] : nil
|
50
|
-
end
|
51
|
-
|
52
|
-
# Gets the names of all the fields that have changed in the document.
|
53
|
-
#
|
54
|
-
# Example:
|
55
|
-
#
|
56
|
-
# person = Person.new(:title => "Sir")
|
57
|
-
# person.title = "Madam"
|
58
|
-
# person.changed # returns [ "title" ]
|
59
|
-
#
|
60
|
-
# Returns:
|
61
|
-
#
|
62
|
-
# An +Array+ of changed field names.
|
63
|
-
def changed
|
64
|
-
modifications.keys
|
65
|
-
end
|
66
|
-
|
67
|
-
# Alerts to whether the document has been modified or not.
|
68
|
-
#
|
69
|
-
# Example:
|
70
|
-
#
|
71
|
-
# person = Person.new(:title => "Sir")
|
72
|
-
# person.title = "Madam"
|
73
|
-
# person.changed? # returns true
|
74
|
-
#
|
75
|
-
# Returns:
|
76
|
-
#
|
77
|
-
# +true+ if changed, +false+ if not.
|
78
|
-
def changed?
|
79
|
-
!modifications.empty?
|
80
|
-
end
|
81
|
-
|
82
|
-
# Gets all the modifications that have happened to the object as a +Hash+
|
83
|
-
# with the keys being the names of the fields, and the values being an
|
84
|
-
# +Array+ with the old value and new value.
|
85
|
-
#
|
86
|
-
# Example:
|
87
|
-
#
|
88
|
-
# person = Person.new(:title => "Sir")
|
89
|
-
# person.title = "Madam"
|
90
|
-
# person.changes # returns { "title" => [ "Sir", "Madam" ] }
|
91
|
-
#
|
92
|
-
# Returns:
|
93
|
-
#
|
94
|
-
# A +Hash+ of changes.
|
95
|
-
def changes
|
96
|
-
modifications
|
97
|
-
end
|
98
|
-
|
99
|
-
# Call this method after save, so the changes can be properly switched.
|
100
|
-
#
|
101
|
-
# Example:
|
102
|
-
#
|
103
|
-
# <tt>person.move_changes</tt>
|
104
|
-
def move_changes
|
105
|
-
@previous_modifications = modifications.dup
|
106
|
-
@modifications = {}
|
107
|
-
end
|
108
|
-
|
109
|
-
# Gets all the new values for each of the changed fields, to be passed to
|
110
|
-
# a MongoDB $set modifier.
|
111
|
-
#
|
112
|
-
# Example:
|
113
|
-
#
|
114
|
-
# person = Person.new(:title => "Sir")
|
115
|
-
# person.title = "Madam"
|
116
|
-
# person.setters # returns { "title" => "Madam" }
|
117
|
-
#
|
118
|
-
# Returns:
|
119
|
-
#
|
120
|
-
# A +Hash+ of new values.
|
121
|
-
def setters
|
122
|
-
modifications.inject({}) do |sets, (field, changes)|
|
123
|
-
key = embedded? ? "#{_position}.#{field}" : field
|
124
|
-
sets[key] = changes[1]; sets
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# Gets all the modifications that have happened to the object before the
|
129
|
-
# object was saved.
|
130
|
-
#
|
131
|
-
# Example:
|
132
|
-
#
|
133
|
-
# person = Person.new(:title => "Sir")
|
134
|
-
# person.title = "Madam"
|
135
|
-
# person.save!
|
136
|
-
# person.previous_changes # returns { "title" => [ "Sir", "Madam" ] }
|
137
|
-
#
|
138
|
-
# Returns:
|
139
|
-
#
|
140
|
-
# A +Hash+ of changes before save.
|
141
|
-
def previous_changes
|
142
|
-
@previous_modifications
|
143
|
-
end
|
144
|
-
|
145
|
-
# Resets a changed field back to its old value.
|
146
|
-
#
|
147
|
-
# Example:
|
148
|
-
#
|
149
|
-
# person = Person.new(:title => "Sir")
|
150
|
-
# person.title = "Madam"
|
151
|
-
# person.reset_attribute!("title")
|
152
|
-
# person.title # "Sir"
|
153
|
-
#
|
154
|
-
# Returns:
|
155
|
-
#
|
156
|
-
# The old field value.
|
157
|
-
def reset_attribute!(name)
|
158
|
-
value = attribute_was(name)
|
159
|
-
if value
|
160
|
-
@attributes[name] = value
|
161
|
-
modifications.delete(name)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
# Sets up the modifications hash. This occurs just after the document is
|
166
|
-
# instantiated.
|
167
|
-
#
|
168
|
-
# Example:
|
169
|
-
#
|
170
|
-
# <tt>document.setup_notifications</tt>
|
171
|
-
def setup_modifications
|
172
|
-
@accessed ||= {}
|
173
|
-
@modifications ||= {}
|
174
|
-
@previous_modifications ||= {}
|
175
|
-
end
|
176
|
-
|
177
|
-
# Reset all modifications for the document. This will wipe all the marked
|
178
|
-
# changes, but not reset the values.
|
179
|
-
#
|
180
|
-
# Example:
|
181
|
-
#
|
182
|
-
# <tt>document.reset_modifications</tt>
|
183
|
-
def reset_modifications
|
184
|
-
@accessed = {}
|
185
|
-
@modifications = {}
|
186
|
-
end
|
187
|
-
|
188
|
-
protected
|
189
|
-
|
190
|
-
# Audit the original value for a field that can be modified in place.
|
191
|
-
#
|
192
|
-
# Example:
|
193
|
-
#
|
194
|
-
# <tt>person.accessed("aliases", [ "007" ])</tt>
|
195
|
-
def accessed(name, value)
|
196
|
-
@accessed ||= {}
|
197
|
-
@accessed[name] = value.dup if (value.is_a?(Array) || value.is_a?(Hash)) && !@accessed.has_key?(name)
|
198
|
-
value
|
199
|
-
end
|
200
|
-
|
201
|
-
# Get all normal modifications plus in place potential changes.
|
202
|
-
#
|
203
|
-
# Example:
|
204
|
-
#
|
205
|
-
# <tt>person.modifications</tt>
|
206
|
-
#
|
207
|
-
# Returns:
|
208
|
-
#
|
209
|
-
# All changes to the document.
|
210
|
-
def modifications
|
211
|
-
@accessed.each_pair do |field, value|
|
212
|
-
current = @attributes[field]
|
213
|
-
@modifications[field] = [ value, current ] if current != value
|
214
|
-
end
|
215
|
-
@accessed.clear
|
216
|
-
@modifications
|
217
|
-
end
|
218
|
-
|
219
|
-
# Audit the change of a field's value.
|
220
|
-
#
|
221
|
-
# Example:
|
222
|
-
#
|
223
|
-
# <tt>person.modify("name", "Jack", "John")</tt>
|
224
|
-
def modify(name, old_value, new_value)
|
225
|
-
@attributes[name] = new_value
|
226
|
-
if @modifications && (old_value != new_value)
|
227
|
-
original = @modifications[name].first if @modifications[name]
|
228
|
-
@modifications[name] = [ (original || old_value), new_value ]
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
module ClassMethods #:nodoc:
|
234
|
-
# Add the dynamic dirty methods. These are custom methods defined on a
|
235
|
-
# field by field basis that wrap the dirty attribute methods.
|
236
|
-
#
|
237
|
-
# Example:
|
238
|
-
#
|
239
|
-
# person = Person.new(:title => "Sir")
|
240
|
-
# person.title = "Madam"
|
241
|
-
# person.title_change # [ "Sir", "Madam" ]
|
242
|
-
# person.title_changed? # true
|
243
|
-
# person.title_was # "Sir"
|
244
|
-
# person.reset_title!
|
245
|
-
def add_dirty_methods(name)
|
246
|
-
define_method("#{name}_change") { attribute_change(name) }
|
247
|
-
define_method("#{name}_changed?") { attribute_changed?(name) }
|
248
|
-
define_method("#{name}_was") { attribute_was(name) }
|
249
|
-
define_method("reset_#{name}!") { reset_attribute!(name) }
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Mongoid #:nodoc:
|
2
|
-
module Extensions #:nodoc:
|
3
|
-
module TimeConversions #:nodoc:
|
4
|
-
def set(value)
|
5
|
-
return nil if value.blank?
|
6
|
-
time = convert_to_time(value)
|
7
|
-
strip_milliseconds(time).utc
|
8
|
-
end
|
9
|
-
|
10
|
-
def get(value)
|
11
|
-
return nil if value.blank?
|
12
|
-
if Mongoid::Config.instance.use_utc?
|
13
|
-
value
|
14
|
-
else
|
15
|
-
value.getlocal
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def strip_milliseconds(time)
|
22
|
-
::Time.at(time.to_i)
|
23
|
-
end
|
24
|
-
|
25
|
-
def convert_to_time(value)
|
26
|
-
case value
|
27
|
-
when ::String then ::Time.parse(value)
|
28
|
-
when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
|
29
|
-
when ::Date then ::Time.utc(value.year, value.month, value.day)
|
30
|
-
else value
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/mongoid/persistence.rb
DELETED
@@ -1,222 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "mongoid/persistence/command"
|
3
|
-
require "mongoid/persistence/insert"
|
4
|
-
require "mongoid/persistence/insert_embedded"
|
5
|
-
require "mongoid/persistence/remove"
|
6
|
-
require "mongoid/persistence/remove_all"
|
7
|
-
require "mongoid/persistence/remove_embedded"
|
8
|
-
require "mongoid/persistence/update"
|
9
|
-
|
10
|
-
module Mongoid #:nodoc:
|
11
|
-
# The persistence module is a mixin to provide database accessor methods for
|
12
|
-
# the document. These correspond to the appropriate accessors on a
|
13
|
-
# +Mongo::Collection+ and retain the same DSL.
|
14
|
-
#
|
15
|
-
# Examples:
|
16
|
-
#
|
17
|
-
# <tt>document.insert</tt>
|
18
|
-
# <tt>document.update</tt>
|
19
|
-
# <tt>document.upsert</tt>
|
20
|
-
module Persistence
|
21
|
-
extend ActiveSupport::Concern
|
22
|
-
module InstanceMethods #:nodoc:
|
23
|
-
# Remove the +Document+ from the datbase with callbacks.
|
24
|
-
#
|
25
|
-
# Example:
|
26
|
-
#
|
27
|
-
# <tt>document.destroy</tt>
|
28
|
-
#
|
29
|
-
# TODO: Will get rid of other #destroy once new persistence complete.
|
30
|
-
def destroy
|
31
|
-
run_callbacks(:before_destroy)
|
32
|
-
if _remove
|
33
|
-
self.destroyed = true
|
34
|
-
run_callbacks(:after_destroy)
|
35
|
-
end; true
|
36
|
-
end
|
37
|
-
|
38
|
-
# Insert a new +Document+ into the database. Will return the document
|
39
|
-
# itself whether or not the save was successful.
|
40
|
-
#
|
41
|
-
# Example:
|
42
|
-
#
|
43
|
-
# <tt>document.insert</tt>
|
44
|
-
def insert(validate = true)
|
45
|
-
Insert.new(self, validate).persist
|
46
|
-
end
|
47
|
-
|
48
|
-
# Remove the +Document+ from the datbase.
|
49
|
-
#
|
50
|
-
# Example:
|
51
|
-
#
|
52
|
-
# <tt>document._remove</tt>
|
53
|
-
#
|
54
|
-
# TODO: Will get rid of other #remove once observable pattern killed.
|
55
|
-
def _remove
|
56
|
-
Remove.new(self).persist
|
57
|
-
end
|
58
|
-
|
59
|
-
alias :delete :_remove
|
60
|
-
|
61
|
-
# Save the document - will perform an insert if the document is new, and
|
62
|
-
# update if not. If a validation error occurs a
|
63
|
-
# Mongoid::Errors::Validations error will get raised.
|
64
|
-
#
|
65
|
-
# Example:
|
66
|
-
#
|
67
|
-
# <tt>document.save!</tt>
|
68
|
-
#
|
69
|
-
# Returns:
|
70
|
-
#
|
71
|
-
# +true+ if validation passed, will raise error otherwise.
|
72
|
-
def save!
|
73
|
-
self.class.fail_validate!(self) unless upsert; true
|
74
|
-
end
|
75
|
-
|
76
|
-
# Update the +Document+ in the datbase.
|
77
|
-
#
|
78
|
-
# Example:
|
79
|
-
#
|
80
|
-
# <tt>document.update</tt>
|
81
|
-
def update(validate = true)
|
82
|
-
Update.new(self, validate).persist
|
83
|
-
end
|
84
|
-
|
85
|
-
# Update the +Document+ attributes in the datbase.
|
86
|
-
#
|
87
|
-
# Example:
|
88
|
-
#
|
89
|
-
# <tt>document.update_attributes(:title => "Sir")</tt>
|
90
|
-
#
|
91
|
-
# Returns:
|
92
|
-
#
|
93
|
-
# +true+ if validation passed, +false+ if not.
|
94
|
-
def update_attributes(attributes = {})
|
95
|
-
write_attributes(attributes); update
|
96
|
-
end
|
97
|
-
|
98
|
-
# Update the +Document+ attributes in the datbase.
|
99
|
-
#
|
100
|
-
# Example:
|
101
|
-
#
|
102
|
-
# <tt>document.update_attributes(:title => "Sir")</tt>
|
103
|
-
#
|
104
|
-
# Returns:
|
105
|
-
#
|
106
|
-
# +true+ if validation passed, raises an error if not
|
107
|
-
def update_attributes!(attributes = {})
|
108
|
-
write_attributes(attributes)
|
109
|
-
result = update
|
110
|
-
self.class.fail_validate!(self) unless result
|
111
|
-
result
|
112
|
-
end
|
113
|
-
|
114
|
-
# Upsert the document - will perform an insert if the document is new, and
|
115
|
-
# update if not.
|
116
|
-
#
|
117
|
-
# Example:
|
118
|
-
#
|
119
|
-
# <tt>document.upsert</tt>
|
120
|
-
#
|
121
|
-
# Returns:
|
122
|
-
#
|
123
|
-
# A +Boolean+ for updates.
|
124
|
-
def upsert(validate = true)
|
125
|
-
validate = parse_validate(validate)
|
126
|
-
if new_record?
|
127
|
-
insert(validate).errors.any? ? false : true
|
128
|
-
else
|
129
|
-
update(validate)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
# Save is aliased so that users familiar with active record can have some
|
134
|
-
# semblance of a familiar API.
|
135
|
-
#
|
136
|
-
# Example:
|
137
|
-
#
|
138
|
-
# <tt>document.save</tt>
|
139
|
-
alias :save :upsert
|
140
|
-
|
141
|
-
protected
|
142
|
-
# Alternative validation params.
|
143
|
-
def parse_validate(validate)
|
144
|
-
if validate.is_a?(Hash) && validate.has_key?(:validate)
|
145
|
-
validate = validate[:validate]
|
146
|
-
end
|
147
|
-
validate
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
module ClassMethods #:nodoc:
|
152
|
-
|
153
|
-
# Create a new +Document+. This will instantiate a new document and
|
154
|
-
# insert it in a single call. Will always return the document
|
155
|
-
# whether save passed or not.
|
156
|
-
#
|
157
|
-
# Example:
|
158
|
-
#
|
159
|
-
# <tt>Person.create(:title => "Mr")</tt>
|
160
|
-
#
|
161
|
-
# Returns: the +Document+.
|
162
|
-
def create(attributes = {})
|
163
|
-
document = new(attributes); document.insert
|
164
|
-
end
|
165
|
-
|
166
|
-
# Create a new +Document+. This will instantiate a new document and
|
167
|
-
# insert it in a single call. Will always return the document
|
168
|
-
# whether save passed or not, and if validation fails an error will be
|
169
|
-
# raise.
|
170
|
-
#
|
171
|
-
# Example:
|
172
|
-
#
|
173
|
-
# <tt>Person.create!(:title => "Mr")</tt>
|
174
|
-
#
|
175
|
-
# Returns: the +Document+.
|
176
|
-
def create!(attributes = {})
|
177
|
-
document = new(attributes)
|
178
|
-
fail_validate!(document) if document.insert.errors.any?
|
179
|
-
document
|
180
|
-
end
|
181
|
-
|
182
|
-
# Delete all documents given the supplied conditions. If no conditions
|
183
|
-
# are passed, the entire collection will be dropped for performance
|
184
|
-
# benefits. Does not fire any callbacks.
|
185
|
-
#
|
186
|
-
# Example:
|
187
|
-
#
|
188
|
-
# <tt>Person.delete_all(:conditions => { :title => "Sir" })</tt>
|
189
|
-
# <tt>Person.delete_all</tt>
|
190
|
-
#
|
191
|
-
# Returns: true or raises an error.
|
192
|
-
def delete_all(conditions = {})
|
193
|
-
RemoveAll.new(
|
194
|
-
self,
|
195
|
-
false,
|
196
|
-
conditions[:conditions] || {}
|
197
|
-
).persist
|
198
|
-
end
|
199
|
-
|
200
|
-
# Delete all documents given the supplied conditions. If no conditions
|
201
|
-
# are passed, the entire collection will be dropped for performance
|
202
|
-
# benefits. Fires the destroy callbacks if conditions were passed.
|
203
|
-
#
|
204
|
-
# Example:
|
205
|
-
#
|
206
|
-
# <tt>Person.destroy_all(:conditions => { :title => "Sir" })</tt>
|
207
|
-
# <tt>Person.destroy_all</tt>
|
208
|
-
#
|
209
|
-
# Returns: true or raises an error.
|
210
|
-
def destroy_all(conditions = {})
|
211
|
-
documents = all(conditions)
|
212
|
-
count = documents.count
|
213
|
-
documents.each { |doc| doc.destroy }; count
|
214
|
-
end
|
215
|
-
|
216
|
-
# Raise an error if validation failed.
|
217
|
-
def fail_validate!(document)
|
218
|
-
raise Errors::Validations.new(document.errors)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|