mongoid 2.0.0.beta.20 → 2.0.0.rc.1
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/README.rdoc +8 -0
- data/Rakefile +51 -0
- data/lib/config/locales/nl.yml +39 -0
- data/lib/config/locales/ro.yml +1 -1
- data/lib/mongoid.rb +17 -17
- data/lib/mongoid/atomicity.rb +54 -22
- data/lib/mongoid/attributes.rb +145 -125
- data/lib/mongoid/callbacks.rb +7 -2
- data/lib/mongoid/collection.rb +49 -32
- data/lib/mongoid/collections.rb +0 -1
- data/lib/mongoid/components.rb +34 -29
- data/lib/mongoid/config.rb +207 -193
- data/lib/mongoid/config/database.rb +167 -0
- data/lib/mongoid/contexts.rb +2 -5
- data/lib/mongoid/contexts/enumerable.rb +30 -4
- data/lib/mongoid/contexts/ids.rb +2 -2
- data/lib/mongoid/contexts/mongo.rb +30 -5
- data/lib/mongoid/copyable.rb +44 -0
- data/lib/mongoid/criteria.rb +110 -56
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/destructive.rb +37 -0
- data/lib/mongoid/criterion/exclusion.rb +3 -1
- data/lib/mongoid/criterion/inclusion.rb +59 -64
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +42 -54
- data/lib/mongoid/criterion/selector.rb +9 -0
- data/lib/mongoid/default_scope.rb +28 -0
- data/lib/mongoid/deprecation.rb +5 -5
- data/lib/mongoid/dirty.rb +4 -5
- data/lib/mongoid/document.rb +161 -114
- data/lib/mongoid/extensions.rb +7 -11
- data/lib/mongoid/extensions/array/parentization.rb +2 -2
- data/lib/mongoid/extensions/date/conversions.rb +1 -1
- data/lib/mongoid/extensions/hash/conversions.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -0
- data/lib/mongoid/extensions/object/reflections.rb +17 -0
- data/lib/mongoid/extensions/object/yoda.rb +27 -0
- data/lib/mongoid/extensions/string/conversions.rb +23 -4
- data/lib/mongoid/extensions/time_conversions.rb +4 -4
- data/lib/mongoid/field.rb +30 -19
- data/lib/mongoid/fields.rb +15 -5
- data/lib/mongoid/finders.rb +19 -11
- data/lib/mongoid/hierarchy.rb +34 -28
- data/lib/mongoid/identity.rb +62 -20
- data/lib/mongoid/inspection.rb +58 -0
- data/lib/mongoid/matchers.rb +20 -0
- data/lib/mongoid/multi_database.rb +11 -0
- data/lib/mongoid/nested_attributes.rb +41 -0
- data/lib/mongoid/paranoia.rb +3 -4
- data/lib/mongoid/paths.rb +1 -1
- data/lib/mongoid/persistence.rb +89 -90
- data/lib/mongoid/persistence/command.rb +20 -4
- data/lib/mongoid/persistence/insert.rb +13 -11
- data/lib/mongoid/persistence/insert_embedded.rb +8 -6
- data/lib/mongoid/persistence/remove.rb +6 -4
- data/lib/mongoid/persistence/remove_all.rb +6 -4
- data/lib/mongoid/persistence/remove_embedded.rb +8 -6
- data/lib/mongoid/persistence/update.rb +12 -10
- data/lib/mongoid/railtie.rb +2 -2
- data/lib/mongoid/railties/database.rake +10 -9
- data/lib/mongoid/relations.rb +104 -0
- data/lib/mongoid/relations/accessors.rb +154 -0
- data/lib/mongoid/relations/auto_save.rb +34 -0
- data/lib/mongoid/relations/binding.rb +24 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +77 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +65 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +78 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +93 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +94 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +63 -0
- data/lib/mongoid/relations/builder.rb +41 -0
- data/lib/mongoid/relations/builders.rb +79 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +25 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +32 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +26 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +116 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +32 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +29 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +30 -0
- data/lib/mongoid/relations/cascading.rb +55 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +19 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/cyclic.rb +97 -0
- data/lib/mongoid/relations/embedded/in.rb +172 -0
- data/lib/mongoid/relations/embedded/many.rb +450 -0
- data/lib/mongoid/relations/embedded/one.rb +169 -0
- data/lib/mongoid/relations/macros.rb +302 -0
- data/lib/mongoid/relations/many.rb +185 -0
- data/lib/mongoid/relations/metadata.rb +529 -0
- data/lib/mongoid/relations/nested_builder.rb +52 -0
- data/lib/mongoid/relations/one.rb +29 -0
- data/lib/mongoid/relations/polymorphic.rb +54 -0
- data/lib/mongoid/relations/proxy.rb +122 -0
- data/lib/mongoid/relations/referenced/in.rb +214 -0
- data/lib/mongoid/relations/referenced/many.rb +358 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +379 -0
- data/lib/mongoid/relations/referenced/one.rb +204 -0
- data/lib/mongoid/relations/reflections.rb +45 -0
- data/lib/mongoid/safe.rb +11 -1
- data/lib/mongoid/safety.rb +122 -97
- data/lib/mongoid/scope.rb +14 -9
- data/lib/mongoid/state.rb +37 -3
- data/lib/mongoid/timestamps.rb +11 -0
- data/lib/mongoid/validations.rb +42 -3
- data/lib/mongoid/validations/associated.rb +8 -5
- data/lib/mongoid/validations/uniqueness.rb +23 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +25 -16
- data/lib/rails/generators/mongoid/model/templates/model.rb +3 -1
- metadata +95 -80
- data/lib/mongoid/associations.rb +0 -364
- data/lib/mongoid/associations/embedded_in.rb +0 -74
- data/lib/mongoid/associations/embeds_many.rb +0 -299
- data/lib/mongoid/associations/embeds_one.rb +0 -111
- data/lib/mongoid/associations/foreign_key.rb +0 -35
- data/lib/mongoid/associations/meta_data.rb +0 -38
- data/lib/mongoid/associations/options.rb +0 -78
- data/lib/mongoid/associations/proxy.rb +0 -60
- data/lib/mongoid/associations/referenced_in.rb +0 -70
- data/lib/mongoid/associations/references_many.rb +0 -254
- data/lib/mongoid/associations/references_many_as_array.rb +0 -128
- data/lib/mongoid/associations/references_one.rb +0 -104
- data/lib/mongoid/extensions/array/accessors.rb +0 -17
- data/lib/mongoid/extensions/array/assimilation.rb +0 -26
- data/lib/mongoid/extensions/hash/accessors.rb +0 -42
- data/lib/mongoid/extensions/hash/assimilation.rb +0 -40
- data/lib/mongoid/extensions/nil/assimilation.rb +0 -17
- data/lib/mongoid/memoization.rb +0 -33
@@ -4,8 +4,8 @@ module Mongoid #:nodoc:
|
|
4
4
|
module Array #:nodoc:
|
5
5
|
module Parentization #:nodoc:
|
6
6
|
# Adds the parent document to each element in the array.
|
7
|
-
def parentize(parent
|
8
|
-
each { |obj| obj.parentize(parent
|
7
|
+
def parentize(parent)
|
8
|
+
each { |obj| obj.parentize(parent) }
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -5,29 +5,6 @@ module Mongoid #:nodoc:
|
|
5
5
|
module Conversions #:nodoc:
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
-
# Get the difference between 2 hashes. This will give back a new hash
|
9
|
-
# with the keys and pairs of [ old, new ] values.
|
10
|
-
#
|
11
|
-
# Example:
|
12
|
-
#
|
13
|
-
# first = { :field => "value" }
|
14
|
-
# second = { :field => "new" }
|
15
|
-
# first.difference(second) # => { :field => [ "value", "new" ] }
|
16
|
-
#
|
17
|
-
# Returns:
|
18
|
-
#
|
19
|
-
# A +Hash+ of modifications.
|
20
|
-
def difference(other)
|
21
|
-
changes = {}
|
22
|
-
each_pair do |key, value|
|
23
|
-
if other.has_key?(key)
|
24
|
-
new_value = other[key]
|
25
|
-
changes[key] = [ value, new_value ] if new_value != value
|
26
|
-
end
|
27
|
-
end
|
28
|
-
changes
|
29
|
-
end
|
30
|
-
|
31
8
|
module ClassMethods #:nodoc:
|
32
9
|
def get(value)
|
33
10
|
value
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
module Object #:nodoc:
|
5
|
+
module Reflections #:nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def ivar(name)
|
9
|
+
if instance_variable_defined?("@#{name}")
|
10
|
+
return instance_variable_get("@#{name}")
|
11
|
+
end
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
module Object #:nodoc:
|
5
|
+
|
6
|
+
# This module behaves like the master jedi.
|
7
|
+
module Yoda #:nodoc:
|
8
|
+
|
9
|
+
# Do or do not, there is no try. -- Yoda.
|
10
|
+
#
|
11
|
+
# @example Do or do not.
|
12
|
+
# object.do_or_do_not(:use, "The Force")
|
13
|
+
#
|
14
|
+
# @param [ String, Symbol ] name The method name.
|
15
|
+
# @param [ Array ] *args The arguments.
|
16
|
+
#
|
17
|
+
# @return [ Object, nil ] The result of the method call or nil if the
|
18
|
+
# method does not exist.
|
19
|
+
#
|
20
|
+
# @since 2.0.0.rc.1
|
21
|
+
def do_or_do_not(name, *args)
|
22
|
+
respond_to?(name) ? send(name, *args) : nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -3,11 +3,30 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module String #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
|
7
|
-
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Convert the string to an array with the string in it.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# <tt>"Testing".to_a</tt>
|
13
|
+
#
|
14
|
+
# Returns:
|
15
|
+
#
|
16
|
+
# An array with only the string in it.
|
17
|
+
def to_a
|
18
|
+
[ self ]
|
8
19
|
end
|
9
|
-
|
10
|
-
|
20
|
+
|
21
|
+
module ClassMethods #:nodoc:
|
22
|
+
|
23
|
+
def get(value)
|
24
|
+
value
|
25
|
+
end
|
26
|
+
|
27
|
+
def set(value)
|
28
|
+
value.to_s unless value.nil?
|
29
|
+
end
|
11
30
|
end
|
12
31
|
end
|
13
32
|
end
|
@@ -9,9 +9,9 @@ module Mongoid #:nodoc:
|
|
9
9
|
|
10
10
|
def get(value)
|
11
11
|
return nil if value.blank?
|
12
|
-
value = value.getlocal unless Mongoid::Config.
|
13
|
-
if Mongoid::Config.
|
14
|
-
time_zone = Mongoid::Config.
|
12
|
+
value = value.getlocal unless Mongoid::Config.use_utc?
|
13
|
+
if Mongoid::Config.use_activesupport_time_zone?
|
14
|
+
time_zone = Mongoid::Config.use_utc? ? 'UTC' : Time.zone
|
15
15
|
value = value.in_time_zone(time_zone)
|
16
16
|
end
|
17
17
|
value
|
@@ -24,7 +24,7 @@ module Mongoid #:nodoc:
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def convert_to_time(value)
|
27
|
-
time = Mongoid::Config.
|
27
|
+
time = Mongoid::Config.use_activesupport_time_zone? ? ::Time.zone : ::Time
|
28
28
|
case value
|
29
29
|
when ::String then time.parse(value)
|
30
30
|
when ::DateTime then time.local(value.year, value.month, value.day, value.hour, value.min, value.sec)
|
data/lib/mongoid/field.rb
CHANGED
@@ -1,16 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
class Field
|
4
|
-
attr_reader :klass, :name, :type
|
5
|
-
|
6
|
-
# Get the declared options for this field
|
7
|
-
#
|
8
|
-
# Returns:
|
9
|
-
#
|
10
|
-
# a hash of options
|
11
|
-
def options
|
12
|
-
@options
|
13
|
-
end
|
4
|
+
attr_reader :copyable, :klass, :name, :options, :type
|
14
5
|
|
15
6
|
# Get the default value for the field.
|
16
7
|
#
|
@@ -34,25 +25,45 @@ module Mongoid #:nodoc:
|
|
34
25
|
# <tt>Field.new(:score, :default => 0)</tt>
|
35
26
|
def initialize(name, options = {})
|
36
27
|
check_name!(name)
|
37
|
-
@type = options[:type] ||
|
28
|
+
@type = options[:type] || Object
|
38
29
|
@name, @default = name, options[:default]
|
39
30
|
@copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
|
40
31
|
@options = options
|
41
32
|
check_default!
|
42
33
|
end
|
43
34
|
|
44
|
-
# Used for setting an object in the attributes hash.
|
45
|
-
#
|
35
|
+
# Used for setting an object in the attributes hash.
|
36
|
+
#
|
37
|
+
# If nil is provided the default will get returned if it exists.
|
38
|
+
#
|
39
|
+
# If the field is an identity field, ie an id, it performs the necessary
|
40
|
+
# cast.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# <tt>field.set("New Value")</tt>
|
45
|
+
#
|
46
|
+
# Returns:
|
47
|
+
#
|
48
|
+
# The new value.
|
46
49
|
def set(object)
|
47
|
-
unless
|
50
|
+
unless options[:identity]
|
48
51
|
type.set(object)
|
49
52
|
else
|
50
|
-
|
51
|
-
object.blank? ? type.set(object) : BSON::ObjectId.cast!(
|
53
|
+
metadata = options[:metadata]
|
54
|
+
object.blank? ? type.set(object) : BSON::ObjectId.cast!(metadata.inverse_klass, object)
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
58
|
# Used for retrieving the object out of the attributes hash.
|
59
|
+
#
|
60
|
+
# Example:
|
61
|
+
#
|
62
|
+
# <tt>field.get("Value")</tt>
|
63
|
+
#
|
64
|
+
# Returns:
|
65
|
+
#
|
66
|
+
# The converted value.
|
56
67
|
def get(object)
|
57
68
|
type.get(object)
|
58
69
|
end
|
@@ -60,7 +71,7 @@ module Mongoid #:nodoc:
|
|
60
71
|
protected
|
61
72
|
# Slightly faster default check.
|
62
73
|
def copy
|
63
|
-
|
74
|
+
copyable ? @default.dup : @default
|
64
75
|
end
|
65
76
|
|
66
77
|
# Check if the name is valid.
|
@@ -72,8 +83,8 @@ module Mongoid #:nodoc:
|
|
72
83
|
|
73
84
|
def check_default!
|
74
85
|
return if @default.is_a?(Proc)
|
75
|
-
if !@default.nil? && !@default.is_a?(
|
76
|
-
raise Mongoid::Errors::InvalidType.new(
|
86
|
+
if !@default.nil? && !@default.is_a?(type)
|
87
|
+
raise Mongoid::Errors::InvalidType.new(type, @default)
|
77
88
|
end
|
78
89
|
end
|
79
90
|
end
|
data/lib/mongoid/fields.rb
CHANGED
@@ -50,11 +50,21 @@ module Mongoid #:nodoc
|
|
50
50
|
|
51
51
|
# Create the field accessors.
|
52
52
|
def create_accessors(name, meth, options = {})
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
generated_field_methods.module_eval do
|
54
|
+
define_method(meth) { read_attribute(name) }
|
55
|
+
define_method("#{meth}=") { |value| write_attribute(name, value) }
|
56
|
+
define_method("#{meth}?") do
|
57
|
+
attr = read_attribute(name)
|
58
|
+
(options[:type] == Boolean) ? attr == true : attr.present?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def generated_field_methods
|
64
|
+
@generated_field_methods ||= begin
|
65
|
+
mod = Module.new
|
66
|
+
include mod
|
67
|
+
mod
|
58
68
|
end
|
59
69
|
end
|
60
70
|
end
|
data/lib/mongoid/finders.rb
CHANGED
@@ -28,7 +28,7 @@ module Mongoid #:nodoc:
|
|
28
28
|
#
|
29
29
|
# <tt>Person.count(:conditions => { :attribute => "value" })</tt>
|
30
30
|
def count(*args)
|
31
|
-
Criteria.translate(self, *args).count
|
31
|
+
Criteria.translate(self, false, *args).count
|
32
32
|
end
|
33
33
|
|
34
34
|
# Returns true if there are on document in database based on the
|
@@ -36,7 +36,7 @@ module Mongoid #:nodoc:
|
|
36
36
|
#
|
37
37
|
# <tt>Person.exists?(:conditions => { :attribute => "value" })</tt>
|
38
38
|
def exists?(*args)
|
39
|
-
Criteria.translate(self, *args).limit(1).count == 1
|
39
|
+
Criteria.translate(self, false, *args).limit(1).count == 1
|
40
40
|
end
|
41
41
|
|
42
42
|
# Helper to initialize a new +Criteria+ object for this class, or return
|
@@ -45,8 +45,8 @@ module Mongoid #:nodoc:
|
|
45
45
|
# Example:
|
46
46
|
#
|
47
47
|
# <tt>Person.criteria</tt>
|
48
|
-
def criteria
|
49
|
-
scope_stack.last || Criteria.new(self)
|
48
|
+
def criteria(embedded = false)
|
49
|
+
scope_stack.last || Criteria.new(self, embedded)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Find a +Document+ in several different ways.
|
@@ -57,15 +57,24 @@ module Mongoid #:nodoc:
|
|
57
57
|
# it will attempt to find either a single +Document+ or multiples based
|
58
58
|
# on the conditions provided and the first parameter.
|
59
59
|
#
|
60
|
-
#
|
60
|
+
# Example:
|
61
61
|
#
|
62
|
+
# <tt>Person.find(:first, :conditions => { :attribute => "value" })</tt>
|
62
63
|
# <tt>Person.find(:all, :conditions => { :attribute => "value" })</tt>
|
64
|
+
# <tt>Person.find(BSON::ObjectId)</tt>
|
65
|
+
#
|
66
|
+
# Options:
|
67
|
+
#
|
68
|
+
# args: An assortment of finder options.
|
63
69
|
#
|
64
|
-
#
|
70
|
+
# Returns:
|
71
|
+
#
|
72
|
+
# A document or criteria.
|
65
73
|
def find(*args)
|
66
|
-
raise Errors::InvalidOptions.new(
|
67
|
-
|
68
|
-
|
74
|
+
raise Errors::InvalidOptions.new(
|
75
|
+
:calling_document_find_with_nil_is_invalid, {}
|
76
|
+
) if args[0].nil?
|
77
|
+
type, criteria = Criteria.parse!(self, false, *args)
|
69
78
|
case type
|
70
79
|
when :first then return criteria.one
|
71
80
|
when :last then return criteria.last
|
@@ -134,7 +143,7 @@ module Mongoid #:nodoc:
|
|
134
143
|
#
|
135
144
|
# Returns paginated array of docs.
|
136
145
|
def paginate(params = {})
|
137
|
-
Criteria.translate(self, params).paginate
|
146
|
+
Criteria.translate(self, false, params).paginate
|
138
147
|
end
|
139
148
|
|
140
149
|
protected
|
@@ -154,7 +163,6 @@ module Mongoid #:nodoc:
|
|
154
163
|
def with_scope(criteria)
|
155
164
|
scope_stack = self.scope_stack
|
156
165
|
scope_stack << criteria
|
157
|
-
|
158
166
|
begin
|
159
167
|
yield criteria
|
160
168
|
ensure
|
data/lib/mongoid/hierarchy.rb
CHANGED
@@ -7,8 +7,13 @@ module Mongoid #:nodoc
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods #:nodoc:
|
10
|
-
|
11
|
-
#
|
10
|
+
|
11
|
+
# Determines if the document is a subclass of another document.
|
12
|
+
#
|
13
|
+
# @example Check if the document is a subclass.
|
14
|
+
# Square.hereditary?
|
15
|
+
#
|
16
|
+
# @return [ true, false ] True if hereditary, false if not.
|
12
17
|
def hereditary?
|
13
18
|
Mongoid::Document > superclass
|
14
19
|
end
|
@@ -23,30 +28,29 @@ module Mongoid #:nodoc
|
|
23
28
|
# always be preferred, since they are optimized calls... This operation
|
24
29
|
# can get expensive in domains with large hierarchies.
|
25
30
|
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# <tt>person._children</tt>
|
31
|
+
# @example Get all the document's children.
|
32
|
+
# person._children
|
29
33
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# All child +Documents+ to this +Document+ in the entire hierarchy.
|
34
|
+
# @return [ Array<Document> ] All child documents in the hierarchy.
|
33
35
|
def _children
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
relations.inject([]) do |children, (name, metadata)|
|
37
|
+
children.tap do |kids|
|
38
|
+
if metadata.embedded? && name != "versions"
|
39
|
+
child = send(name)
|
40
|
+
child.to_a.each do |doc|
|
41
|
+
kids.push(doc).concat(doc._children)
|
42
|
+
end unless child.blank?
|
43
|
+
end
|
40
44
|
end
|
41
|
-
children
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
45
|
-
#
|
48
|
+
# Determines if the document is a subclass of another document.
|
46
49
|
#
|
47
|
-
#
|
50
|
+
# @example Check if the document is a subclass
|
51
|
+
# Square.new.hereditary?
|
48
52
|
#
|
49
|
-
#
|
53
|
+
# @return [ true, false ] True if hereditary, false if not.
|
50
54
|
def hereditary?
|
51
55
|
self.class.hereditary?
|
52
56
|
end
|
@@ -54,21 +58,23 @@ module Mongoid #:nodoc
|
|
54
58
|
# Sets up a child/parent association. This is used for newly created
|
55
59
|
# objects so they can be properly added to the graph.
|
56
60
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# abject: The parent object that needs to be set for the child.
|
60
|
-
# association_name: The name of the association for the child.
|
61
|
+
# @example Set the parent document.
|
62
|
+
# document.parentize(parent)
|
61
63
|
#
|
62
|
-
#
|
64
|
+
# @param [ Document ] document The parent document.
|
63
65
|
#
|
64
|
-
#
|
65
|
-
def parentize(
|
66
|
-
self._parent =
|
67
|
-
self.association_name = association_name.to_s
|
66
|
+
# @return [ Document ] The parent document.
|
67
|
+
def parentize(document)
|
68
|
+
self._parent = document
|
68
69
|
end
|
69
70
|
|
70
|
-
# Return the root
|
71
|
+
# Return the root document in the object graph. If the current document
|
71
72
|
# is the root object in the graph it will return self.
|
73
|
+
#
|
74
|
+
# @example Get the root document in the hierarchy.
|
75
|
+
# document._root
|
76
|
+
#
|
77
|
+
# @return [ Document ] The root document in the hierarchy.
|
72
78
|
def _root
|
73
79
|
object = self
|
74
80
|
while (object._parent) do object = object._parent; end
|