mongoid 2.8.1 → 3.0.0.rc
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/CHANGELOG.md +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +69 -50
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -110
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -77
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# Mongoid's implementation of Rails' nested attributes.
|
5
5
|
module NestedAttributes
|
@@ -7,12 +7,14 @@ module Mongoid #:nodoc:
|
|
7
7
|
|
8
8
|
included do
|
9
9
|
class_attribute :nested_attributes
|
10
|
-
self.nested_attributes =
|
10
|
+
self.nested_attributes = {}
|
11
11
|
end
|
12
12
|
|
13
|
-
module ClassMethods
|
13
|
+
module ClassMethods
|
14
14
|
|
15
|
-
REJECT_ALL_BLANK_PROC =
|
15
|
+
REJECT_ALL_BLANK_PROC = ->(attributes){
|
16
|
+
attributes.all? { |key, value| key == '_destroy' || value.blank? }
|
17
|
+
}
|
16
18
|
|
17
19
|
# Used when needing to update related models from a parent relation. Can
|
18
20
|
# be used on embedded or referenced relations.
|
@@ -33,18 +35,24 @@ module Mongoid #:nodoc:
|
|
33
35
|
# by a hash of options.
|
34
36
|
#
|
35
37
|
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
36
|
-
# @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
|
38
|
+
# @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
|
39
|
+
# to a class method to reject documents with.
|
37
40
|
# @option *args [ Integer ] :limit The max number to create.
|
38
41
|
# @option *args [ true, false ] :update_only Only update existing docs.
|
39
42
|
def accepts_nested_attributes_for(*args)
|
40
43
|
options = args.extract_options!
|
41
44
|
options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
|
42
45
|
args.each do |name|
|
43
|
-
|
44
|
-
|
46
|
+
meth = "#{name}_attributes="
|
47
|
+
self.nested_attributes["#{name}_attributes"] = meth
|
48
|
+
metadata = relations[name.to_s]
|
49
|
+
unless metadata
|
50
|
+
raise Errors::NestedAttributesMetadataNotFound.new(self, name)
|
51
|
+
end
|
52
|
+
autosave(metadata.merge!(autosave: true))
|
53
|
+
re_define_method(meth) do |attrs|
|
45
54
|
_assigning do
|
46
|
-
|
47
|
-
relation.nested_builder(attrs, options).build(self)
|
55
|
+
metadata.nested_builder(attrs, options).build(self)
|
48
56
|
end
|
49
57
|
end
|
50
58
|
end
|
data/lib/mongoid/observer.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# Observer classes respond to life cycle callbacks to implement trigger-like
|
5
5
|
# behavior outside the original class. This is a great way to reduce the
|
@@ -176,6 +176,5 @@ module Mongoid #:nodoc:
|
|
176
176
|
return false unless klass.respond_to?(:observers)
|
177
177
|
klass.observers.disabled_for?(self) || Mongoid.observers.disabled_for?(self)
|
178
178
|
end
|
179
|
-
|
180
179
|
end
|
181
180
|
end
|
data/lib/mongoid/paranoia.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# Include this module to get soft deletion of root level documents.
|
5
5
|
# This will add a deleted_at field to the +Document+, managed automatically.
|
@@ -14,7 +14,7 @@ module Mongoid #:nodoc:
|
|
14
14
|
extend ActiveSupport::Concern
|
15
15
|
|
16
16
|
included do
|
17
|
-
field :deleted_at, :
|
17
|
+
field :deleted_at, type: Time
|
18
18
|
self.paranoid = true
|
19
19
|
end
|
20
20
|
|
@@ -56,11 +56,8 @@ module Mongoid #:nodoc:
|
|
56
56
|
# @since 1.0.0
|
57
57
|
def remove(options = {})
|
58
58
|
time = self.deleted_at = Time.now
|
59
|
-
paranoid_collection.
|
60
|
-
|
61
|
-
{ "$set" => { paranoid_field => time }},
|
62
|
-
Safety.merge_safety_options(options)
|
63
|
-
)
|
59
|
+
paranoid_collection.find(atomic_selector).
|
60
|
+
update({ "$set" => { paranoid_field => time }})
|
64
61
|
cascade!
|
65
62
|
@destroyed = true
|
66
63
|
IdentityMap.remove(self)
|
@@ -78,7 +75,7 @@ module Mongoid #:nodoc:
|
|
78
75
|
#
|
79
76
|
# @since 1.0.0
|
80
77
|
def destroyed?
|
81
|
-
@destroyed || !!deleted_at
|
78
|
+
(@destroyed ||= false) || !!deleted_at
|
82
79
|
end
|
83
80
|
|
84
81
|
# Restores a previously soft-deleted document. Handles this by removing the
|
@@ -91,10 +88,8 @@ module Mongoid #:nodoc:
|
|
91
88
|
#
|
92
89
|
# @since 1.0.0
|
93
90
|
def restore
|
94
|
-
paranoid_collection.
|
95
|
-
|
96
|
-
{ "$unset" => { paranoid_field => true }}
|
97
|
-
)
|
91
|
+
paranoid_collection.find(atomic_selector).
|
92
|
+
update({ "$unset" => { paranoid_field => true }})
|
98
93
|
attributes.delete("deleted_at")
|
99
94
|
end
|
100
95
|
|
@@ -124,21 +119,21 @@ module Mongoid #:nodoc:
|
|
124
119
|
embedded? ? "#{atomic_position}.deleted_at" : "deleted_at"
|
125
120
|
end
|
126
121
|
|
127
|
-
module ClassMethods
|
122
|
+
module ClassMethods
|
128
123
|
|
129
124
|
# Override the default +Criteria+ accessor to only get existing
|
130
|
-
# documents.
|
125
|
+
# documents.
|
131
126
|
#
|
132
127
|
# @example Override the criteria.
|
133
|
-
# Person.
|
128
|
+
# Person.queryable
|
134
129
|
#
|
135
130
|
# @param [ Array ] args The arguments.
|
136
131
|
#
|
137
132
|
# @return [ Criteria ] The paranoid compliant criteria.
|
138
133
|
#
|
139
|
-
# @since
|
140
|
-
def
|
141
|
-
|
134
|
+
# @since 3.0.0
|
135
|
+
def queryable
|
136
|
+
super.where(deleted_at: nil)
|
142
137
|
end
|
143
138
|
|
144
139
|
# Find deleted documents
|
data/lib/mongoid/persistence.rb
CHANGED
@@ -5,7 +5,7 @@ require "mongoid/persistence/insertion"
|
|
5
5
|
require "mongoid/persistence/modification"
|
6
6
|
require "mongoid/persistence/operations"
|
7
7
|
|
8
|
-
module Mongoid
|
8
|
+
module Mongoid
|
9
9
|
|
10
10
|
# The persistence module is a mixin to provide database accessor methods for
|
11
11
|
# the document. These correspond to the appropriate accessors on a
|
@@ -19,7 +19,7 @@ module Mongoid #:nodoc:
|
|
19
19
|
extend ActiveSupport::Concern
|
20
20
|
include Atomic
|
21
21
|
|
22
|
-
# Remove the document from the
|
22
|
+
# Remove the document from the database with callbacks.
|
23
23
|
#
|
24
24
|
# @example Destroy a document.
|
25
25
|
# document.destroy
|
@@ -29,11 +29,11 @@ module Mongoid #:nodoc:
|
|
29
29
|
# @return [ true, false ] True if successful, false if not.
|
30
30
|
def destroy(options = {})
|
31
31
|
self.flagged_for_destroy = true
|
32
|
-
run_callbacks(:destroy) do
|
32
|
+
result = run_callbacks(:destroy) do
|
33
33
|
remove(options)
|
34
|
-
end.tap do
|
35
|
-
self.flagged_for_destroy = false
|
36
34
|
end
|
35
|
+
self.flagged_for_destroy = false
|
36
|
+
result
|
37
37
|
end
|
38
38
|
|
39
39
|
# Insert a new document into the database. Will return the document
|
@@ -49,7 +49,7 @@ module Mongoid #:nodoc:
|
|
49
49
|
Operations.insert(self, options).persist
|
50
50
|
end
|
51
51
|
|
52
|
-
# Remove the document from the
|
52
|
+
# Remove the document from the database.
|
53
53
|
#
|
54
54
|
# @example Remove the document.
|
55
55
|
# document.remove
|
@@ -79,8 +79,7 @@ module Mongoid #:nodoc:
|
|
79
79
|
return true
|
80
80
|
end
|
81
81
|
|
82
|
-
|
83
|
-
# Touch the document, in effect updating its updated_at timestamp and
|
82
|
+
# Touch the document, in effect updating it's updated_at timestamp and
|
84
83
|
# optionally the provided field to the current time. If any belongs_to
|
85
84
|
# relations exist with a touch option, they will be updated as well.
|
86
85
|
#
|
@@ -94,25 +93,21 @@ module Mongoid #:nodoc:
|
|
94
93
|
#
|
95
94
|
# @param [ Symbol ] field The name of an additional field to update.
|
96
95
|
#
|
97
|
-
# @return [ true
|
96
|
+
# @return [ true ] true.
|
98
97
|
#
|
99
|
-
# @since
|
98
|
+
# @since 3.0.0
|
100
99
|
def touch(field = nil)
|
101
|
-
return false if _root.new_record?
|
102
100
|
current = Time.now
|
103
101
|
write_attribute(:updated_at, current) if fields["updated_at"]
|
104
102
|
write_attribute(field, current) if field
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
_root.collection.update(atomic_selector, touches)
|
103
|
+
collection.find(atomic_selector).update(atomic_updates)
|
104
|
+
without_autobuild do
|
105
|
+
touchables.each { |name| send(name).try(:touch) }
|
109
106
|
end
|
110
|
-
|
111
|
-
touchables.each { |name| send(name).try(:touch) }
|
112
107
|
move_changes and true
|
113
108
|
end
|
114
109
|
|
115
|
-
# Update the document in the
|
110
|
+
# Update the document in the database.
|
116
111
|
#
|
117
112
|
# @example Update an existing document.
|
118
113
|
# document.update
|
@@ -133,15 +128,21 @@ module Mongoid #:nodoc:
|
|
133
128
|
# @param [ Symbol, String ] name The name of the attribute.
|
134
129
|
# @param [ Object ] value The new value of the attribute.a
|
135
130
|
#
|
131
|
+
# @raise [ Errors::ReadonlyAttribute ] If the field cannot be changed due
|
132
|
+
# to being flagged as reaodnly.
|
133
|
+
#
|
136
134
|
# @return [ true, false ] True if save was successfull, false if not.
|
137
135
|
#
|
138
136
|
# @since 2.0.0.rc.6
|
139
137
|
def update_attribute(name, value)
|
138
|
+
unless attribute_writable?(name.to_s)
|
139
|
+
raise Errors::ReadonlyAttribute.new(name, value)
|
140
|
+
end
|
140
141
|
write_attribute(name, value)
|
141
|
-
save(:
|
142
|
+
save(validate: false)
|
142
143
|
end
|
143
144
|
|
144
|
-
# Update the document attributes in the
|
145
|
+
# Update the document attributes in the database.
|
145
146
|
#
|
146
147
|
# @example Update the document's attributes
|
147
148
|
# document.update_attributes(:title => "Sir")
|
@@ -165,12 +166,12 @@ module Mongoid #:nodoc:
|
|
165
166
|
#
|
166
167
|
# @return [ true, false ] True if validation passed.
|
167
168
|
def update_attributes!(attributes = {}, options = {})
|
168
|
-
update_attributes(attributes, options)
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
end
|
169
|
+
result = update_attributes(attributes, options)
|
170
|
+
unless result
|
171
|
+
self.class.fail_validate!(self) if errors.any?
|
172
|
+
self.class.fail_callback!(self, :update_attributes!)
|
173
173
|
end
|
174
|
+
result
|
174
175
|
end
|
175
176
|
|
176
177
|
# Upsert the document - will perform an insert if the document is new, and
|
@@ -184,7 +185,7 @@ module Mongoid #:nodoc:
|
|
184
185
|
# @return [ true, false ] True is success, false if not.
|
185
186
|
def upsert(options = {})
|
186
187
|
if new_record?
|
187
|
-
|
188
|
+
insert(options).persisted?
|
188
189
|
else
|
189
190
|
update(options)
|
190
191
|
end
|
@@ -207,7 +208,9 @@ module Mongoid #:nodoc:
|
|
207
208
|
# @return [ Document ] The newly created document.
|
208
209
|
def create(attributes = {}, options = {}, &block)
|
209
210
|
_creating do
|
210
|
-
new(attributes, options, &block)
|
211
|
+
doc = new(attributes, options, &block)
|
212
|
+
doc.save
|
213
|
+
doc
|
211
214
|
end
|
212
215
|
end
|
213
216
|
|
@@ -226,10 +229,10 @@ module Mongoid #:nodoc:
|
|
226
229
|
# @return [ Document ] The newly created document.
|
227
230
|
def create!(attributes = {}, options = {}, &block)
|
228
231
|
_creating do
|
229
|
-
new(attributes, options, &block)
|
230
|
-
|
231
|
-
|
232
|
-
|
232
|
+
doc = new(attributes, options, &block)
|
233
|
+
fail_validate!(doc) if doc.insert.errors.any?
|
234
|
+
fail_callback!(doc, :create!) if doc.new_record?
|
235
|
+
doc
|
233
236
|
end
|
234
237
|
end
|
235
238
|
|
@@ -249,11 +252,12 @@ module Mongoid #:nodoc:
|
|
249
252
|
def delete_all(conditions = nil)
|
250
253
|
conds = conditions || {}
|
251
254
|
selector = conds[:conditions] || conds
|
252
|
-
selector.merge!(:
|
253
|
-
collection
|
254
|
-
|
255
|
-
|
256
|
-
|
255
|
+
selector.merge!(_type: name) if hereditary?
|
256
|
+
coll = collection
|
257
|
+
deleted = coll.find(selector).count
|
258
|
+
coll.find(selector).remove_all
|
259
|
+
Threaded.clear_options!
|
260
|
+
deleted
|
257
261
|
end
|
258
262
|
|
259
263
|
# Delete all documents given the supplied conditions. If no conditions
|
@@ -272,9 +276,9 @@ module Mongoid #:nodoc:
|
|
272
276
|
def destroy_all(conditions = nil)
|
273
277
|
conds = conditions || {}
|
274
278
|
documents = where(conds[:conditions] || conds)
|
275
|
-
documents.count
|
276
|
-
|
277
|
-
|
279
|
+
destroyed = documents.count
|
280
|
+
documents.each { |doc| doc.destroy }
|
281
|
+
destroyed
|
278
282
|
end
|
279
283
|
|
280
284
|
# Raise an error if validation failed.
|
@@ -12,8 +12,8 @@ require "mongoid/persistence/atomic/rename"
|
|
12
12
|
require "mongoid/persistence/atomic/sets"
|
13
13
|
require "mongoid/persistence/atomic/unset"
|
14
14
|
|
15
|
-
module Mongoid
|
16
|
-
module Persistence
|
15
|
+
module Mongoid
|
16
|
+
module Persistence
|
17
17
|
|
18
18
|
# This module provides the explicit atomic operations helpers on the
|
19
19
|
# document itself.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Atomic
|
2
|
+
module Mongoid
|
3
|
+
module Persistence
|
4
|
+
module Atomic
|
5
5
|
|
6
6
|
# This class provides the ability to perform an explicit $addToSet
|
7
7
|
# modification on a specific field.
|
@@ -23,12 +23,8 @@ module Mongoid #:nodoc:
|
|
23
23
|
Array.wrap(value).each do |val|
|
24
24
|
values.push(val) unless values.include?(val)
|
25
25
|
end
|
26
|
-
|
27
|
-
|
28
|
-
collection.update(document.atomic_selector, operation("$addToSet"), options)
|
29
|
-
document.remove_change(field)
|
30
|
-
end
|
31
|
-
end
|
26
|
+
execute("$addToSet")
|
27
|
+
values
|
32
28
|
end
|
33
29
|
end
|
34
30
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Atomic
|
2
|
+
module Mongoid
|
3
|
+
module Persistence
|
4
|
+
module Atomic
|
5
5
|
|
6
6
|
# This operation is for performing $bit atomic operations against the
|
7
7
|
# database.
|
@@ -25,10 +25,8 @@ module Mongoid #:nodoc:
|
|
25
25
|
result = result | val if bit.to_s == "or"
|
26
26
|
result
|
27
27
|
end
|
28
|
-
|
29
|
-
|
30
|
-
document.remove_change(field)
|
31
|
-
end
|
28
|
+
execute("$bit")
|
29
|
+
document[field]
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Atomic
|
2
|
+
module Mongoid
|
3
|
+
module Persistence
|
4
|
+
module Atomic
|
5
5
|
|
6
6
|
# This class provides atomic $inc behaviour.
|
7
7
|
class Inc
|
@@ -19,10 +19,8 @@ module Mongoid #:nodoc:
|
|
19
19
|
prepare do
|
20
20
|
current = document[field] || 0
|
21
21
|
document[field] = current + value
|
22
|
-
|
23
|
-
|
24
|
-
document.remove_change(field)
|
25
|
-
end
|
22
|
+
execute("$inc")
|
23
|
+
document[field]
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Persistence
|
4
|
-
module Atomic
|
2
|
+
module Mongoid
|
3
|
+
module Persistence
|
4
|
+
module Atomic
|
5
5
|
|
6
6
|
# This is the included module for all atomic operation objects.
|
7
7
|
module Operation
|
@@ -33,7 +33,7 @@ module Mongoid #:nodoc:
|
|
33
33
|
# @since 2.0.0
|
34
34
|
def initialize(document, field, value, options = {})
|
35
35
|
@document, @field, @value = document, field.to_s, value
|
36
|
-
@options =
|
36
|
+
@options = options
|
37
37
|
end
|
38
38
|
|
39
39
|
# Get the atomic operation to perform.
|
@@ -75,8 +75,47 @@ module Mongoid #:nodoc:
|
|
75
75
|
#
|
76
76
|
# @since 2.1.0
|
77
77
|
def prepare
|
78
|
-
yield(document)
|
79
|
-
|
78
|
+
doc = yield(document)
|
79
|
+
Threaded.clear_options!
|
80
|
+
doc
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Executes the common functionality between operations.
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
#
|
89
|
+
# @example Execute the operation.
|
90
|
+
# operation.execute("$push")
|
91
|
+
#
|
92
|
+
# @param [ String ] name The name of the operation.
|
93
|
+
#
|
94
|
+
# @since 3.0.0
|
95
|
+
def execute(name)
|
96
|
+
if document.persisted?
|
97
|
+
collection.find(document.atomic_selector).update(operation(name))
|
98
|
+
document.remove_change(field)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Appends items to an array and executes the corresponding $push or
|
103
|
+
# $pushAll operation.
|
104
|
+
#
|
105
|
+
# @api private
|
106
|
+
#
|
107
|
+
# @example Execute the append.
|
108
|
+
# operation.append_with("$push")
|
109
|
+
#
|
110
|
+
# @param [ String ] name The name of the operation - $push or $pushAll.
|
111
|
+
#
|
112
|
+
# @since 3.0.0
|
113
|
+
def append_with(name)
|
114
|
+
prepare do
|
115
|
+
document[field] = [] unless document[field]
|
116
|
+
docs = document.send(field).concat(value.__array__)
|
117
|
+
execute(name)
|
118
|
+
docs
|
80
119
|
end
|
81
120
|
end
|
82
121
|
end
|