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
@@ -3,41 +3,11 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Hash #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
|
7
|
-
|
8
|
-
module InstanceMethods #:nodoc:
|
9
|
-
|
10
|
-
# Get the difference between 2 hashes. This will give back a new hash
|
11
|
-
# with the keys and pairs of [ old, new ] values.
|
12
|
-
#
|
13
|
-
# Example:
|
14
|
-
#
|
15
|
-
# first = { :field => "value" }
|
16
|
-
# second = { :field => "new" }
|
17
|
-
# first.difference(second) # => { :field => [ "value", "new" ] }
|
18
|
-
#
|
19
|
-
# Returns:
|
20
|
-
#
|
21
|
-
# A +Hash+ of modifications.
|
22
|
-
def difference(other)
|
23
|
-
changes = {}
|
24
|
-
each_pair do |key, value|
|
25
|
-
if other.has_key?(key)
|
26
|
-
new_value = other[key]
|
27
|
-
changes[key] = [ value, new_value ] if new_value != value
|
28
|
-
end
|
29
|
-
end
|
30
|
-
changes
|
31
|
-
end
|
6
|
+
def get(value)
|
7
|
+
value
|
32
8
|
end
|
33
|
-
|
34
|
-
|
35
|
-
def get(value)
|
36
|
-
value
|
37
|
-
end
|
38
|
-
def set(value)
|
39
|
-
value
|
40
|
-
end
|
9
|
+
def set(value)
|
10
|
+
value
|
41
11
|
end
|
42
12
|
end
|
43
13
|
end
|
@@ -5,11 +5,7 @@ module Mongoid #:nodoc:
|
|
5
5
|
module Conversions #:nodoc:
|
6
6
|
def set(value)
|
7
7
|
return nil if value.blank?
|
8
|
-
|
9
|
-
Integer(value)
|
10
|
-
rescue ArgumentError => e
|
11
|
-
puts(e.message); value
|
12
|
-
end
|
8
|
+
value =~ /\d/ ? value.to_i : value
|
13
9
|
end
|
14
10
|
def get(value)
|
15
11
|
value
|
@@ -4,13 +4,7 @@ module Mongoid #:nodoc:
|
|
4
4
|
module Object #:nodoc:
|
5
5
|
# This module converts objects into mongoid related objects.
|
6
6
|
module Conversions #:nodoc:
|
7
|
-
|
8
|
-
base.class_eval do
|
9
|
-
include InstanceMethods
|
10
|
-
extend ClassMethods
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
7
|
+
extend ActiveSupport::Concern
|
14
8
|
module InstanceMethods
|
15
9
|
# Converts this object to a hash of attributes
|
16
10
|
def mongoidize
|
@@ -24,7 +18,7 @@ module Mongoid #:nodoc:
|
|
24
18
|
end
|
25
19
|
|
26
20
|
def get(value)
|
27
|
-
|
21
|
+
self.new(value)
|
28
22
|
end
|
29
23
|
end
|
30
24
|
end
|
@@ -23,7 +23,7 @@ module Mongoid #:nodoc:
|
|
23
23
|
to_s.plural?
|
24
24
|
end
|
25
25
|
|
26
|
-
["gt", "lt", "gte", "lte", "ne", "
|
26
|
+
["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all", "size", "exists"].each do |oper|
|
27
27
|
class_eval <<-OPERATORS
|
28
28
|
def #{oper}
|
29
29
|
Criterion::Complex.new(:key => self, :operator => "#{oper}")
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
module Time #:nodoc:
|
5
|
+
module Conversions #:nodoc:
|
6
|
+
def set(value)
|
7
|
+
return nil if value.blank?
|
8
|
+
time = ::Time.parse(value.is_a?(::Time) ? value.strftime("%Y-%m-%d %H:%M:%S %Z") : value.to_s)
|
9
|
+
time.utc? ? time : time.utc
|
10
|
+
end
|
11
|
+
def get(value)
|
12
|
+
return nil if value.blank?
|
13
|
+
::Time.zone ? value.getlocal : value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/mongoid/factory.rb
CHANGED
@@ -11,8 +11,7 @@ module Mongoid #:nodoc:
|
|
11
11
|
#
|
12
12
|
# klass: The class to instantiate from if _type is not present.
|
13
13
|
# attributes: The +Document+ attributes.
|
14
|
-
def self.build(klass,
|
15
|
-
attrs = {}.merge(attributes)
|
14
|
+
def self.build(klass, attrs)
|
16
15
|
type = attrs["_type"]
|
17
16
|
type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
|
18
17
|
end
|
data/lib/mongoid/field.rb
CHANGED
@@ -18,7 +18,7 @@ module Mongoid #:nodoc:
|
|
18
18
|
#
|
19
19
|
# The primitive value or a copy of the default.
|
20
20
|
def default
|
21
|
-
|
21
|
+
(@default.is_a?(Array) || @default.is_a?(Hash)) ? @default.dup : @default
|
22
22
|
end
|
23
23
|
|
24
24
|
# Create the new field with a name and optional additional options. Valid
|
@@ -34,7 +34,6 @@ module Mongoid #:nodoc:
|
|
34
34
|
# <tt>Field.new(:score, :default => 0)</tt>
|
35
35
|
def initialize(name, options = {})
|
36
36
|
@name, @default = name, options[:default]
|
37
|
-
@copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
|
38
37
|
@type = options[:type] || String
|
39
38
|
@accessible = options.has_key?(:accessible) ? options[:accessible] : true
|
40
39
|
end
|
@@ -42,18 +41,12 @@ module Mongoid #:nodoc:
|
|
42
41
|
# Used for setting an object in the attributes hash. If nil is provided the
|
43
42
|
# default will get returned if it exists.
|
44
43
|
def set(object)
|
45
|
-
type.set(object)
|
44
|
+
object.nil? ? default : type.set(object)
|
46
45
|
end
|
47
46
|
|
48
47
|
# Used for retrieving the object out of the attributes hash.
|
49
48
|
def get(object)
|
50
49
|
type.get(object)
|
51
50
|
end
|
52
|
-
|
53
|
-
protected
|
54
|
-
# Slightly faster default check.
|
55
|
-
def copy
|
56
|
-
@copyable ? @default.dup : @default
|
57
|
-
end
|
58
51
|
end
|
59
52
|
end
|
data/lib/mongoid/fields.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc
|
3
3
|
module Fields #:nodoc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
class_inheritable_accessor :fields
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
# Set up the class attributes that must be available to all subclasses.
|
7
|
+
# These include defaults, fields
|
8
|
+
class_inheritable_accessor :fields
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
delegate :defaults, :fields, :to => "self.class"
|
14
|
-
end
|
10
|
+
self.fields = {}
|
11
|
+
delegate :defaults, :fields, :to => "self.class"
|
15
12
|
end
|
16
13
|
|
17
14
|
module ClassMethods #:nodoc
|
@@ -47,7 +44,6 @@ module Mongoid #:nodoc
|
|
47
44
|
meth = options.delete(:as) || name
|
48
45
|
fields[name] = Field.new(name, options)
|
49
46
|
create_accessors(name, meth, options)
|
50
|
-
add_dirty_methods(name)
|
51
47
|
end
|
52
48
|
|
53
49
|
# Create the field accessors.
|
data/lib/mongoid/finders.rb
CHANGED
@@ -42,7 +42,7 @@ module Mongoid #:nodoc:
|
|
42
42
|
# Find a +Document+ in several different ways.
|
43
43
|
#
|
44
44
|
# If a +String+ is provided, it will be assumed that it is a
|
45
|
-
# representation of a Mongo::
|
45
|
+
# representation of a Mongo::ObjectID and will attempt to find a single
|
46
46
|
# +Document+ based on that id. If a +Symbol+ and +Hash+ is provided then
|
47
47
|
# it will attempt to find either a single +Document+ or multiples based
|
48
48
|
# on the conditions provided and the first parameter.
|
@@ -51,7 +51,7 @@ module Mongoid #:nodoc:
|
|
51
51
|
#
|
52
52
|
# <tt>Person.find(:all, :conditions => { :attribute => "value" })</tt>
|
53
53
|
#
|
54
|
-
# <tt>Person.find(Mongo::
|
54
|
+
# <tt>Person.find(Mongo::ObjectID.new.to_s)</tt>
|
55
55
|
def find(*args)
|
56
56
|
raise Errors::InvalidOptions.new("Calling Document#find with nil is invalid") if args[0].nil?
|
57
57
|
type = args.delete_at(0) if args[0].is_a?(Symbol)
|
data/lib/mongoid/identity.rb
CHANGED
@@ -5,7 +5,7 @@ module Mongoid #:nodoc:
|
|
5
5
|
# Create the identity for the +Document+.
|
6
6
|
#
|
7
7
|
# The id will be set in either in the form of a Mongo
|
8
|
-
# +
|
8
|
+
# +ObjectID+ or a composite key set up by defining a key on the document.
|
9
9
|
#
|
10
10
|
# The _type will be set to the document's class name.
|
11
11
|
def create(doc)
|
@@ -15,19 +15,19 @@ module Mongoid #:nodoc:
|
|
15
15
|
protected
|
16
16
|
# Return the proper id for the document.
|
17
17
|
def generate_id
|
18
|
-
id =
|
18
|
+
id = Mongo::ObjectID.new
|
19
19
|
Mongoid.use_object_ids ? id : id.to_s
|
20
20
|
end
|
21
21
|
|
22
22
|
# Set the id for the document.
|
23
23
|
def identify(doc)
|
24
24
|
doc.id = compose(doc).join(" ").identify if doc.primary_key
|
25
|
-
doc.id = generate_id
|
25
|
+
doc.id = generate_id unless doc.id
|
26
26
|
end
|
27
27
|
|
28
28
|
# Set the _type field on the document.
|
29
29
|
def type(doc)
|
30
|
-
doc._type = doc.class.name if
|
30
|
+
doc._type = doc.class.name if Mongoid.persist_types
|
31
31
|
end
|
32
32
|
|
33
33
|
# Generates the composite key for a document.
|
data/lib/mongoid/indexes.rb
CHANGED
@@ -1,21 +1,18 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc
|
3
3
|
module Indexes #:nodoc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
cattr_accessor :indexed
|
9
|
-
self.indexed = false
|
10
|
-
end
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
cattr_accessor :indexed
|
7
|
+
self.indexed = false
|
11
8
|
end
|
12
9
|
|
13
10
|
module ClassMethods #:nodoc
|
14
11
|
# Add the default indexes to the root document if they do not already
|
15
12
|
# exist. Currently this is only _type.
|
16
13
|
def add_indexes
|
17
|
-
|
18
|
-
self._collection.create_index(:_type,
|
14
|
+
unless indexed
|
15
|
+
self._collection.create_index(:_type, false)
|
19
16
|
self.indexed = true
|
20
17
|
end
|
21
18
|
end
|
@@ -23,7 +20,7 @@ module Mongoid #:nodoc
|
|
23
20
|
# Adds an index on the field specified. Options can be :unique => true or
|
24
21
|
# :unique => false. It will default to the latter.
|
25
22
|
def index(name, options = { :unique => false })
|
26
|
-
collection.create_index(name, options)
|
23
|
+
collection.create_index(name, options[:unique])
|
27
24
|
end
|
28
25
|
end
|
29
26
|
end
|
data/lib/mongoid/memoization.rb
CHANGED
@@ -2,20 +2,14 @@ module Mongoid #:nodoc
|
|
2
2
|
module Memoization
|
3
3
|
|
4
4
|
# Handles cases when accessing an association that should be memoized in
|
5
|
-
# the Mongoid specific manner.
|
5
|
+
# the Mongoid specific manner.
|
6
6
|
def memoized(name, &block)
|
7
7
|
var = "@#{name}"
|
8
8
|
if instance_variable_defined?(var)
|
9
9
|
return instance_variable_get(var)
|
10
10
|
end
|
11
11
|
value = yield
|
12
|
-
instance_variable_set(var, value)
|
13
|
-
end
|
14
|
-
|
15
|
-
# Removes an memozied association if it exists
|
16
|
-
def unmemoize(name)
|
17
|
-
var = "@#{name}"
|
18
|
-
remove_instance_variable(var) if instance_variable_defined?(var)
|
12
|
+
instance_variable_set(var, value)
|
19
13
|
end
|
20
14
|
|
21
15
|
# Mongoid specific behavior is to remove the memoized object when setting
|
data/lib/mongoid/named_scope.rb
CHANGED
@@ -27,11 +27,16 @@ module Mongoid #:nodoc:
|
|
27
27
|
end
|
28
28
|
EOT
|
29
29
|
end
|
30
|
+
|
31
|
+
alias :scope :named_scope
|
32
|
+
|
30
33
|
alias :scope :named_scope
|
31
34
|
|
32
35
|
# Return the scopes or default to an empty +Hash+.
|
33
36
|
def scopes
|
34
37
|
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
|
35
38
|
end
|
39
|
+
|
36
40
|
end
|
37
41
|
end
|
42
|
+
|
data/lib/mongoid/observable.rb
CHANGED
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
|
|
24
24
|
#
|
25
25
|
# <tt>document.notify_observers(self)</tt>
|
26
26
|
def notify_observers(*args)
|
27
|
-
@observers.dup.each { |observer| observer.
|
27
|
+
@observers.dup.each { |observer| observer.update(*args) } if @observers
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/mongoid/paths.rb
CHANGED
@@ -3,49 +3,29 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Paths #:nodoc:
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
included do
|
6
|
-
|
7
|
-
|
6
|
+
cattr_accessor :_path, :_position
|
7
|
+
delegate :_path, :_position, :to => "self.class"
|
8
8
|
end
|
9
9
|
module InstanceMethods
|
10
|
-
# Get the insertion modifier for the document. Will be nil on root
|
11
|
-
# documents, $set on embeds_one, $push on embeds_many.
|
12
|
-
#
|
13
|
-
# Example:
|
14
|
-
#
|
15
|
-
# <tt>name.inserter</tt>
|
16
|
-
def _inserter
|
17
|
-
embedded? ? (embedded_many? ? "$push" : "$set") : nil
|
18
|
-
end
|
19
|
-
|
20
10
|
# Return the path to this +Document+ in JSON notation, used for atomic
|
21
11
|
# updates via $set in MongoDB.
|
22
12
|
#
|
23
13
|
# Example:
|
24
14
|
#
|
25
15
|
# <tt>address.path # returns "addresses"</tt>
|
26
|
-
def
|
27
|
-
|
16
|
+
def path
|
17
|
+
self._path ||= climb("") do |document, value|
|
18
|
+
value = "#{document.association_name}#{"." + value unless value.blank?}"
|
19
|
+
end
|
28
20
|
end
|
29
|
-
alias :_pull :_path
|
30
21
|
|
31
22
|
# Returns the positional operator of this document for modification.
|
32
23
|
#
|
33
24
|
# Example:
|
34
25
|
#
|
35
26
|
# <tt>address.position</tt>
|
36
|
-
def
|
37
|
-
|
38
|
-
embedded? ? "#{_parent._position}#{"." unless _parent._position.blank?}#{@association_name}#{locator}" : ""
|
39
|
-
end
|
40
|
-
|
41
|
-
# Get the removal modifier for the document. Will be nil on root
|
42
|
-
# documents, $unset on embeds_one, $set on embeds_many.
|
43
|
-
#
|
44
|
-
# Example:
|
45
|
-
#
|
46
|
-
# <tt>name.remover</tt>
|
47
|
-
def _remover
|
48
|
-
embedded? ? (_index ? "$pull" : "$unset") : nil
|
27
|
+
def position
|
28
|
+
self._position ||= (path.blank? ? "" : "#{path}.$")
|
49
29
|
end
|
50
30
|
|
51
31
|
# Return the selector for this document to be matched exactly for use
|
@@ -54,8 +34,20 @@ module Mongoid #:nodoc:
|
|
54
34
|
# Example:
|
55
35
|
#
|
56
36
|
# <tt>address.selector</tt>
|
57
|
-
def
|
58
|
-
|
37
|
+
def selector
|
38
|
+
@selector ||= climb({ "_id" => _root.id }) do |document, value|
|
39
|
+
value["#{document.path}._id"] = document.id; value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def climb(value, &block)
|
45
|
+
document = self;
|
46
|
+
while (document._parent) do
|
47
|
+
value = yield document, value
|
48
|
+
document = document._parent
|
49
|
+
end
|
50
|
+
value
|
59
51
|
end
|
60
52
|
end
|
61
53
|
end
|
data/lib/mongoid/state.rb
CHANGED
@@ -1,39 +1,32 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module State #:nodoc:
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
# Returns true if the +Document+ has not been persisted to the database,
|
5
|
+
# false if it has. This is determined by the variable @new_record
|
6
|
+
# and NOT if the object has an id.
|
7
|
+
def new_record?
|
8
|
+
@new_record == true
|
7
9
|
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def new_record?
|
14
|
-
!!@new_record
|
15
|
-
end
|
16
|
-
|
17
|
-
# Sets the new_record boolean - used after document is saved.
|
18
|
-
def new_record=(saved)
|
19
|
-
@new_record = saved
|
20
|
-
end
|
11
|
+
# Sets the new_record boolean - used after document is saved.
|
12
|
+
def new_record=(saved)
|
13
|
+
@new_record = saved
|
14
|
+
end
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
# Checks if the document has been saved to the database.
|
17
|
+
def persisted?
|
18
|
+
!new_record?
|
19
|
+
end
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
# Returns true if the +Document+ has been succesfully destroyed, and false if it hasn't.
|
22
|
+
# This is determined by the variable @destroyed and NOT by checking the database.
|
23
|
+
def destroyed?
|
24
|
+
@destroyed == true
|
25
|
+
end
|
32
26
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
27
|
+
# Sets the destroyed boolean - used after document is destroyed.
|
28
|
+
def destroyed=(destroyed)
|
29
|
+
@destroyed = destroyed && true
|
37
30
|
end
|
38
31
|
end
|
39
32
|
end
|