mongoid-locomotive 2.0.0.beta9
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 +47 -0
- data/lib/mongoid.rb +141 -0
- data/lib/mongoid/associations.rb +306 -0
- data/lib/mongoid/associations/embedded_in.rb +74 -0
- data/lib/mongoid/associations/embeds_many.rb +280 -0
- data/lib/mongoid/associations/embeds_one.rb +97 -0
- data/lib/mongoid/associations/foreign_key.rb +35 -0
- data/lib/mongoid/associations/meta_data.rb +38 -0
- data/lib/mongoid/associations/options.rb +62 -0
- data/lib/mongoid/associations/proxy.rb +33 -0
- data/lib/mongoid/associations/referenced_in.rb +59 -0
- data/lib/mongoid/associations/references_many.rb +245 -0
- data/lib/mongoid/associations/references_many_as_array.rb +78 -0
- data/lib/mongoid/associations/references_one.rb +99 -0
- data/lib/mongoid/atomicity.rb +55 -0
- data/lib/mongoid/attributes.rb +242 -0
- data/lib/mongoid/callbacks.rb +21 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections.rb +71 -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/components.rb +34 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/contexts.rb +24 -0
- data/lib/mongoid/contexts/enumerable.rb +156 -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/criteria.rb +248 -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 +189 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +21 -0
- data/lib/mongoid/dirty.rb +252 -0
- data/lib/mongoid/document.rb +210 -0
- data/lib/mongoid/errors.rb +131 -0
- data/lib/mongoid/extensions.rb +115 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -0
- data/lib/mongoid/extensions/array/conversions.rb +23 -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 +27 -0
- data/lib/mongoid/extensions/date/conversions.rb +24 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/false_class/equality.rb +13 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/accessors.rb +42 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
- data/lib/mongoid/extensions/hash/conversions.rb +42 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -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 +21 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/set/conversions.rb +20 -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 +40 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extensions/true_class/equality.rb +13 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +83 -0
- data/lib/mongoid/fields.rb +62 -0
- data/lib/mongoid/finders.rb +145 -0
- data/lib/mongoid/hierarchy.rb +74 -0
- data/lib/mongoid/identity.rb +47 -0
- data/lib/mongoid/indexes.rb +27 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/logger.rb +19 -0
- data/lib/mongoid/matchers.rb +35 -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/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/paranoia.rb +106 -0
- data/lib/mongoid/paths.rb +61 -0
- data/lib/mongoid/persistence.rb +216 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +48 -0
- data/lib/mongoid/persistence/insert_embedded.rb +44 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +38 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +71 -0
- data/lib/mongoid/railtie.rb +67 -0
- data/lib/mongoid/railties/database.rake +60 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +32 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +5 -0
- data/lib/mongoid/validations/uniqueness.rb +56 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +26 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
- data/spec/integration/mongoid/associations_spec.rb +768 -0
- data/spec/integration/mongoid/attributes_spec.rb +59 -0
- data/spec/integration/mongoid/callback_spec.rb +33 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +281 -0
- data/spec/integration/mongoid/dirty_spec.rb +85 -0
- data/spec/integration/mongoid/document_spec.rb +741 -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 +171 -0
- data/spec/integration/mongoid/named_scope_spec.rb +58 -0
- data/spec/integration/mongoid/paranoia_spec.rb +44 -0
- data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
- data/spec/integration/mongoid/persistence_spec.rb +311 -0
- data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
- data/spec/models/account.rb +5 -0
- data/spec/models/address.rb +40 -0
- data/spec/models/agent.rb +7 -0
- data/spec/models/animal.rb +15 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/callbacks.rb +47 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/comment.rb +10 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/favorite.rb +8 -0
- data/spec/models/game.rb +9 -0
- data/spec/models/inheritance.rb +72 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -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/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +106 -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 +25 -0
- data/spec/models/preference.rb +7 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/survey.rb +6 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/user.rb +6 -0
- data/spec/models/user_accout.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +5 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
- data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
- data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
- data/spec/unit/mongoid/associations/options_spec.rb +215 -0
- data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
- data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
- data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
- data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
- data/spec/unit/mongoid/associations_spec.rb +688 -0
- data/spec/unit/mongoid/atomicity_spec.rb +164 -0
- data/spec/unit/mongoid/attributes_spec.rb +646 -0
- data/spec/unit/mongoid/callbacks_spec.rb +85 -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/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/collections_spec.rb +98 -0
- data/spec/unit/mongoid/config_spec.rb +298 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +873 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
- data/spec/unit/mongoid/cursor_spec.rb +80 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/dirty_spec.rb +430 -0
- data/spec/unit/mongoid/document_spec.rb +623 -0
- data/spec/unit/mongoid/errors_spec.rb +154 -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 +52 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -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 +145 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -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 +59 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -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 +29 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
- data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
- data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
- data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -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 +169 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +439 -0
- data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +99 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/logger_spec.rb +38 -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/paranoia_spec.rb +108 -0
- data/spec/unit/mongoid/paths_spec.rb +272 -0
- data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
- data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
- data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
- data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
- data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
- data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
- data/spec/unit/mongoid/persistence_spec.rb +452 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/serialization_spec.rb +43 -0
- data/spec/unit/mongoid/state_spec.rb +94 -0
- data/spec/unit/mongoid/timestamps_spec.rb +30 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
- data/spec/unit/mongoid/validations_spec.rb +43 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +433 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Document
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
include Mongoid::Components
|
|
7
|
+
|
|
8
|
+
cattr_accessor :primary_key
|
|
9
|
+
|
|
10
|
+
attr_accessor :association_name
|
|
11
|
+
attr_reader :new_record
|
|
12
|
+
|
|
13
|
+
delegate :primary_key, :to => "self.class"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module ClassMethods #:nodoc:
|
|
17
|
+
|
|
18
|
+
# Perform default behavior but mark the hierarchy as being hereditary.
|
|
19
|
+
#
|
|
20
|
+
# This method must remain in the +Document+ module, even though its
|
|
21
|
+
# behavior affects items in the Hierarchy module.
|
|
22
|
+
def inherited(subclass)
|
|
23
|
+
super(subclass)
|
|
24
|
+
self.hereditary = true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Instantiate a new object, only when loaded from the database or when
|
|
28
|
+
# the attributes have already been typecast.
|
|
29
|
+
#
|
|
30
|
+
# Example:
|
|
31
|
+
#
|
|
32
|
+
# <tt>Person.instantiate(:title => "Sir", :age => 30)</tt>
|
|
33
|
+
def instantiate(attrs = nil, allocating = false)
|
|
34
|
+
attributes = attrs || {}
|
|
35
|
+
if attributes["_id"] || allocating
|
|
36
|
+
document = allocate
|
|
37
|
+
document.instance_variable_set(:@attributes, attributes)
|
|
38
|
+
document.setup_modifications
|
|
39
|
+
return document
|
|
40
|
+
else
|
|
41
|
+
return new(attrs)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Defines the field that will be used for the id of this +Document+. This
|
|
46
|
+
# set the id of this +Document+ before save to a parameterized version of
|
|
47
|
+
# the field that was supplied. This is good for use for readable URLS in
|
|
48
|
+
# web applications.
|
|
49
|
+
#
|
|
50
|
+
# Example:
|
|
51
|
+
#
|
|
52
|
+
# class Person
|
|
53
|
+
# include Mongoid::Document
|
|
54
|
+
# key :first_name, :last_name
|
|
55
|
+
# end
|
|
56
|
+
def key(*fields)
|
|
57
|
+
self.primary_key = fields
|
|
58
|
+
set_callback :save, :before, :identify
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Returns all types to query for when using this class as the base.
|
|
62
|
+
# *subclasses* is from activesupport. Note that a bug in *subclasses*
|
|
63
|
+
# causes the first call to only return direct children, hence
|
|
64
|
+
# the double call and unique.
|
|
65
|
+
def _types
|
|
66
|
+
@_type ||= [subclasses + subclasses + [self.name]].flatten.uniq.map(&:to_s)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Performs equality checking on the document ids. For more robust
|
|
71
|
+
# equality checking please override this method.
|
|
72
|
+
def ==(other)
|
|
73
|
+
return false unless other.is_a?(Document)
|
|
74
|
+
id == other.id
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Delegates to ==
|
|
78
|
+
def eql?(comparison_object)
|
|
79
|
+
self == (comparison_object)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Delegates to id in order to allow two records of the same type and id to work with something like:
|
|
83
|
+
# [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
|
|
84
|
+
def hash
|
|
85
|
+
id.hash
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Introduces a child object into the +Document+ object graph. This will
|
|
89
|
+
# set up the relationships between the parent and child and update the
|
|
90
|
+
# attributes of the parent +Document+.
|
|
91
|
+
#
|
|
92
|
+
# Options:
|
|
93
|
+
#
|
|
94
|
+
# parent: The +Document+ to assimilate with.
|
|
95
|
+
# options: The association +Options+ for the child.
|
|
96
|
+
def assimilate(parent, options)
|
|
97
|
+
parentize(parent, options.name); notify; self
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Return the attributes hash with indifferent access.
|
|
101
|
+
def attributes
|
|
102
|
+
@attributes.with_indifferent_access
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Clone the current +Document+. This will return all attributes with the
|
|
106
|
+
# exception of the document's id and versions.
|
|
107
|
+
def clone
|
|
108
|
+
self.class.instantiate(@attributes.except("_id").except("versions").dup, true)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Generate an id for this +Document+.
|
|
112
|
+
def identify
|
|
113
|
+
Identity.new(self).create
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Instantiate a new +Document+, setting the Document's attributes if
|
|
117
|
+
# given. If no attributes are provided, they will be initialized with
|
|
118
|
+
# an empty +Hash+.
|
|
119
|
+
#
|
|
120
|
+
# If a primary key is defined, the document's id will be set to that key,
|
|
121
|
+
# otherwise it will be set to a fresh +BSON::ObjectID+ string.
|
|
122
|
+
#
|
|
123
|
+
# Options:
|
|
124
|
+
#
|
|
125
|
+
# attrs: The attributes +Hash+ to set up the document with.
|
|
126
|
+
def initialize(attrs = nil)
|
|
127
|
+
@attributes = default_attributes
|
|
128
|
+
process(attrs)
|
|
129
|
+
@new_record = true
|
|
130
|
+
document = yield self if block_given?
|
|
131
|
+
identify
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Returns the class name plus its attributes.
|
|
135
|
+
def inspect
|
|
136
|
+
attrs = fields.map { |name, field| "#{name}: #{@attributes[name].inspect}" }
|
|
137
|
+
if Mongoid.allow_dynamic_fields
|
|
138
|
+
dynamic_keys = @attributes.keys - fields.keys - associations.keys - ["_id", "_type"]
|
|
139
|
+
attrs += dynamic_keys.map { |name| "#{name}: #{@attributes[name].inspect}" }
|
|
140
|
+
end
|
|
141
|
+
"#<#{self.class.name} _id: #{id}, #{attrs * ', '}>"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Notify parent of an update.
|
|
145
|
+
#
|
|
146
|
+
# Example:
|
|
147
|
+
#
|
|
148
|
+
# <tt>person.notify</tt>
|
|
149
|
+
def notify
|
|
150
|
+
_parent.update_child(self) if _parent
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Return the attributes hash.
|
|
154
|
+
def raw_attributes
|
|
155
|
+
@attributes
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Reloads the +Document+ attributes from the database.
|
|
159
|
+
def reload
|
|
160
|
+
reloaded = collection.find_one(:_id => id)
|
|
161
|
+
if Mongoid.raise_not_found_error
|
|
162
|
+
raise Errors::DocumentNotFound.new(self.class, id) if reloaded.nil?
|
|
163
|
+
end
|
|
164
|
+
@attributes = {}.merge(reloaded || {})
|
|
165
|
+
self.associations.keys.each { |association_name| unmemoize(association_name) }; self
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Remove a child document from this parent +Document+. Will reset the
|
|
169
|
+
# memoized association and notify the parent of the change.
|
|
170
|
+
def remove(child)
|
|
171
|
+
name = child.association_name
|
|
172
|
+
if @building_nested
|
|
173
|
+
@attributes.remove(name, child.raw_attributes)
|
|
174
|
+
else
|
|
175
|
+
reset(name) { @attributes.remove(name, child.raw_attributes) }
|
|
176
|
+
notify
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# def remove_without_reset
|
|
181
|
+
# name = child.association_name
|
|
182
|
+
# @attributes.remove(name, child.raw_attributes)
|
|
183
|
+
# notify
|
|
184
|
+
# end
|
|
185
|
+
|
|
186
|
+
# Return an array with this +Document+ only in it.
|
|
187
|
+
def to_a
|
|
188
|
+
[ self ]
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Recieve a notify call from a child +Document+. This will either update
|
|
192
|
+
# existing attributes on the +Document+ or clear them out for the child if
|
|
193
|
+
# the clear boolean is provided.
|
|
194
|
+
#
|
|
195
|
+
# Options:
|
|
196
|
+
#
|
|
197
|
+
# child: The child +Document+ that sent the notification.
|
|
198
|
+
# clear: Will clear out the child's attributes if set to true.
|
|
199
|
+
def update_child(child, clear = false)
|
|
200
|
+
name = child.association_name
|
|
201
|
+
attrs = child.instance_variable_get(:@attributes)
|
|
202
|
+
if clear
|
|
203
|
+
@attributes.delete(name)
|
|
204
|
+
else
|
|
205
|
+
# check good for array only
|
|
206
|
+
@attributes.insert(name, attrs) unless @attributes[name] && @attributes[name].include?(attrs)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc
|
|
3
|
+
module Errors #:nodoc
|
|
4
|
+
|
|
5
|
+
# Default parent Mongoid error for all custom errors
|
|
6
|
+
class MongoidError < StandardError; end
|
|
7
|
+
|
|
8
|
+
# Raised when querying the database for a document by a specific id which
|
|
9
|
+
# does not exist. If multiple ids were passed then it will display all of
|
|
10
|
+
# those.
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
#
|
|
14
|
+
# <tt>DocumentNotFound.new(Person, ["1", "2"])</tt>
|
|
15
|
+
class DocumentNotFound < MongoidError
|
|
16
|
+
attr_reader :klass, :indentifiers
|
|
17
|
+
def initialize(klass, ids)
|
|
18
|
+
@klass = klass
|
|
19
|
+
@identifiers = ids.is_a?(Array) ? ids.join(", ") : ids
|
|
20
|
+
super("Document not found for class #{@klass} with id(s) #{@identifiers}")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Raised when invalid options are passed into a constructor or method.
|
|
25
|
+
#
|
|
26
|
+
# Example:
|
|
27
|
+
#
|
|
28
|
+
# <tt>InvalidOptions.new</tt>
|
|
29
|
+
class InvalidOptions < MongoidError; end
|
|
30
|
+
|
|
31
|
+
# Raised when the database connection has not been set up properly, either
|
|
32
|
+
# by attempting to set an object on the db that is not a +Mongo::DB+, or
|
|
33
|
+
# not setting anything at all.
|
|
34
|
+
#
|
|
35
|
+
# Example:
|
|
36
|
+
#
|
|
37
|
+
# <tt>InvalidDatabase.new("Not a DB")</tt>
|
|
38
|
+
class InvalidDatabase < MongoidError
|
|
39
|
+
attr_reader :database
|
|
40
|
+
def initialize(database)
|
|
41
|
+
@database = database
|
|
42
|
+
super("Database should be a Mongo::DB, not #{@database.class.name}")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Raised when trying to get or set a value for a defined field, where the
|
|
47
|
+
# type of the object does not match the defined field type.
|
|
48
|
+
#
|
|
49
|
+
# Example:
|
|
50
|
+
#
|
|
51
|
+
# <tt>InvalidType.new(Array, "Not an Array")</tt>
|
|
52
|
+
class InvalidType < MongoidError
|
|
53
|
+
def initialize(klass, value)
|
|
54
|
+
super("Field was defined as a(n) #{klass.name}, but received a #{value.class.name} " +
|
|
55
|
+
"with the value #{value.inspect}.")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Raised when the database version is not supported by Mongoid.
|
|
60
|
+
#
|
|
61
|
+
# Example:
|
|
62
|
+
#
|
|
63
|
+
# <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
|
|
64
|
+
class UnsupportedVersion < MongoidError
|
|
65
|
+
def initialize(version)
|
|
66
|
+
super("MongoDB #{version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Raised when a persisence method ending in ! fails validation. The message
|
|
71
|
+
# will contain the full error messages from the +Document+ in question.
|
|
72
|
+
#
|
|
73
|
+
# Example:
|
|
74
|
+
#
|
|
75
|
+
# <tt>Validations.new(person.errors)</tt>
|
|
76
|
+
class Validations < MongoidError
|
|
77
|
+
attr_reader :document
|
|
78
|
+
def initialize(document)
|
|
79
|
+
@document = document
|
|
80
|
+
super("Validation Failed: #{@document.errors.full_messages.join(", ")}")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# This error is raised when trying to access a Mongo::Collection from an
|
|
85
|
+
# embedded document.
|
|
86
|
+
#
|
|
87
|
+
# Example:
|
|
88
|
+
#
|
|
89
|
+
# <tt>InvalidCollection.new(Address)</tt>
|
|
90
|
+
class InvalidCollection < MongoidError
|
|
91
|
+
attr_reader :klass
|
|
92
|
+
def initialize(klass)
|
|
93
|
+
@klass = klass
|
|
94
|
+
super("Access to the collection for #{@klass.name} is not allowed " +
|
|
95
|
+
"since it is an embedded document, please access a collection from " +
|
|
96
|
+
"the root document")
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# This error is raised when trying to create a field that conflicts with
|
|
101
|
+
# a Mongoid internal attribute or method.
|
|
102
|
+
#
|
|
103
|
+
# Example:
|
|
104
|
+
#
|
|
105
|
+
# <tt>InvalidField.new('collection')</tt>
|
|
106
|
+
class InvalidField < MongoidError
|
|
107
|
+
attr_reader :name
|
|
108
|
+
def initialize(name)
|
|
109
|
+
@name = name
|
|
110
|
+
super("Defining a field named '#{@name}' is not allowed. " +
|
|
111
|
+
"Do not define fields that conflict with Mongoid internal attributes " +
|
|
112
|
+
"or method names. Use Document#instance_methods to see what " +
|
|
113
|
+
"names this includes.")
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# This error is raised when trying to create set nested records above the
|
|
118
|
+
# specified :limit
|
|
119
|
+
#
|
|
120
|
+
# Example:
|
|
121
|
+
#
|
|
122
|
+
#<tt>TooManyNestedAttributeRecords.new('association', limit)
|
|
123
|
+
class TooManyNestedAttributeRecords < MongoidError
|
|
124
|
+
attr_reader :association, :limit
|
|
125
|
+
def initialize(association, limit)
|
|
126
|
+
@association, @limit = association.to_s.humanize.capitalize, limit
|
|
127
|
+
super("Accept Nested Attributes for #{@association} is limited to #{@limit} records")
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "mongoid/extensions/time_conversions"
|
|
3
|
+
require "mongoid/extensions/array/accessors"
|
|
4
|
+
require "mongoid/extensions/array/assimilation"
|
|
5
|
+
require "mongoid/extensions/array/conversions"
|
|
6
|
+
require "mongoid/extensions/array/parentization"
|
|
7
|
+
require "mongoid/extensions/set/conversions"
|
|
8
|
+
require "mongoid/extensions/big_decimal/conversions"
|
|
9
|
+
require "mongoid/extensions/binary/conversions"
|
|
10
|
+
require "mongoid/extensions/boolean/conversions"
|
|
11
|
+
require "mongoid/extensions/date/conversions"
|
|
12
|
+
require "mongoid/extensions/datetime/conversions"
|
|
13
|
+
require "mongoid/extensions/false_class/equality"
|
|
14
|
+
require "mongoid/extensions/float/conversions"
|
|
15
|
+
require "mongoid/extensions/hash/accessors"
|
|
16
|
+
require "mongoid/extensions/hash/assimilation"
|
|
17
|
+
require "mongoid/extensions/hash/conversions"
|
|
18
|
+
require "mongoid/extensions/hash/criteria_helpers"
|
|
19
|
+
require "mongoid/extensions/hash/scoping"
|
|
20
|
+
require "mongoid/extensions/integer/conversions"
|
|
21
|
+
require "mongoid/extensions/nil/assimilation"
|
|
22
|
+
require "mongoid/extensions/object/conversions"
|
|
23
|
+
require "mongoid/extensions/proc/scoping"
|
|
24
|
+
require "mongoid/extensions/string/conversions"
|
|
25
|
+
require "mongoid/extensions/string/inflections"
|
|
26
|
+
require "mongoid/extensions/symbol/inflections"
|
|
27
|
+
require "mongoid/extensions/true_class/equality"
|
|
28
|
+
require "mongoid/extensions/objectid/conversions"
|
|
29
|
+
|
|
30
|
+
class Array #:nodoc
|
|
31
|
+
include Mongoid::Extensions::Array::Accessors
|
|
32
|
+
include Mongoid::Extensions::Array::Assimilation
|
|
33
|
+
include Mongoid::Extensions::Array::Conversions
|
|
34
|
+
include Mongoid::Extensions::Array::Parentization
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class Set #:nodoc
|
|
38
|
+
include Mongoid::Extensions::Set::Conversions
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class BigDecimal #:nodoc
|
|
42
|
+
extend Mongoid::Extensions::BigDecimal::Conversions
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class Binary #:nodoc
|
|
46
|
+
extend Mongoid::Extensions::Binary::Conversions
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class Boolean #:nodoc
|
|
50
|
+
include Mongoid::Extensions::Boolean::Conversions
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class DateTime #:nodoc
|
|
54
|
+
extend Mongoid::Extensions::TimeConversions
|
|
55
|
+
extend Mongoid::Extensions::DateTime::Conversions
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
class Date #:nodoc
|
|
59
|
+
extend Mongoid::Extensions::TimeConversions
|
|
60
|
+
extend Mongoid::Extensions::Date::Conversions
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class FalseClass #:nodoc
|
|
64
|
+
include Mongoid::Extensions::FalseClass::Equality
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
class Float #:nodoc
|
|
68
|
+
extend Mongoid::Extensions::Float::Conversions
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class Hash #:nodoc
|
|
72
|
+
include Mongoid::Extensions::Hash::Accessors
|
|
73
|
+
include Mongoid::Extensions::Hash::Assimilation
|
|
74
|
+
include Mongoid::Extensions::Hash::CriteriaHelpers
|
|
75
|
+
include Mongoid::Extensions::Hash::Scoping
|
|
76
|
+
include Mongoid::Extensions::Hash::Conversions
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class Integer #:nodoc
|
|
80
|
+
extend Mongoid::Extensions::Integer::Conversions
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class NilClass #:nodoc
|
|
84
|
+
include Mongoid::Extensions::Nil::Assimilation
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
class Object #:nodoc:
|
|
88
|
+
include Mongoid::Extensions::Object::Conversions
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class Proc #:nodoc:
|
|
92
|
+
include Mongoid::Extensions::Proc::Scoping
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
class String #:nodoc
|
|
96
|
+
include Mongoid::Extensions::String::Inflections
|
|
97
|
+
extend Mongoid::Extensions::String::Conversions
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class Symbol #:nodoc
|
|
101
|
+
remove_method :size if instance_methods.include? :size # temporal fix for ruby 1.9
|
|
102
|
+
include Mongoid::Extensions::Symbol::Inflections
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class Time #:nodoc
|
|
106
|
+
extend Mongoid::Extensions::TimeConversions
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
class TrueClass #:nodoc
|
|
110
|
+
include Mongoid::Extensions::TrueClass::Equality
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
class BSON::ObjectID #:nodoc
|
|
114
|
+
extend Mongoid::Extensions::ObjectID::Conversions
|
|
115
|
+
end
|