mongoid 2.0.0.rc.7 → 2.0.0.rc.8
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/lib/config/locales/en.yml +3 -0
- data/lib/config/locales/id.yml +46 -0
- data/lib/config/locales/ja.yml +40 -0
- data/lib/config/locales/vi.yml +45 -0
- data/lib/mongoid.rb +5 -3
- data/lib/mongoid/attributes.rb +24 -63
- data/lib/mongoid/attributes/processing.rb +5 -2
- data/lib/mongoid/callbacks.rb +10 -0
- data/lib/mongoid/collection.rb +24 -0
- data/lib/mongoid/collections/master.rb +14 -6
- data/lib/mongoid/collections/operations.rb +1 -1
- data/lib/mongoid/collections/retry.rb +39 -0
- data/lib/mongoid/collections/slaves.rb +26 -10
- data/lib/mongoid/components.rb +4 -4
- data/lib/mongoid/config.rb +6 -3
- data/lib/mongoid/contexts.rb +0 -1
- data/lib/mongoid/contexts/enumerable.rb +19 -7
- data/lib/mongoid/contexts/mongo.rb +9 -5
- data/lib/mongoid/copyable.rb +10 -8
- data/lib/mongoid/criteria.rb +83 -61
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/creational.rb +2 -2
- data/lib/mongoid/criterion/exclusion.rb +58 -32
- data/lib/mongoid/criterion/inclusion.rb +49 -10
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/criterion/selector.rb +80 -11
- data/lib/mongoid/cursor.rb +6 -1
- data/lib/mongoid/default_scope.rb +27 -19
- data/lib/mongoid/document.rb +26 -1
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +7 -4
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/field.rb +47 -30
- data/lib/mongoid/fields.rb +9 -2
- data/lib/mongoid/finders.rb +15 -49
- data/lib/mongoid/identity.rb +6 -4
- data/lib/mongoid/keys.rb +85 -31
- data/lib/mongoid/multi_parameter_attributes.rb +2 -2
- data/lib/mongoid/named_scope.rb +129 -28
- data/lib/mongoid/observer.rb +36 -0
- data/lib/mongoid/paranoia.rb +3 -3
- data/lib/mongoid/paths.rb +1 -1
- data/lib/mongoid/persistence.rb +2 -0
- data/lib/mongoid/persistence/atomic.rb +88 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +30 -0
- data/lib/mongoid/persistence/atomic/inc.rb +28 -0
- data/lib/mongoid/persistence/atomic/operation.rb +44 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +33 -0
- data/lib/mongoid/persistence/atomic/push.rb +28 -0
- data/lib/mongoid/railtie.rb +13 -1
- data/lib/mongoid/relations.rb +1 -0
- data/lib/mongoid/relations/accessors.rb +20 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +17 -6
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -1
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -0
- data/lib/mongoid/relations/embedded/atomic.rb +86 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/many.rb +57 -25
- data/lib/mongoid/relations/macros.rb +6 -4
- data/lib/mongoid/relations/many.rb +51 -10
- data/lib/mongoid/relations/metadata.rb +4 -2
- data/lib/mongoid/relations/proxy.rb +39 -24
- data/lib/mongoid/relations/referenced/many.rb +47 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +47 -14
- data/lib/mongoid/relations/referenced/one.rb +14 -0
- data/lib/mongoid/sharding.rb +51 -0
- data/lib/mongoid/state.rb +3 -2
- data/lib/mongoid/timestamps.rb +5 -29
- data/lib/mongoid/timestamps/created.rb +31 -0
- data/lib/mongoid/timestamps/updated.rb +33 -0
- data/lib/mongoid/validations.rb +10 -3
- data/lib/mongoid/validations/referenced.rb +58 -0
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +67 -5
- data/lib/rails/generators/mongoid/model/templates/model.rb +2 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/mongoid_generator.rb +10 -1
- data/lib/rails/mongoid.rb +1 -0
- metadata +29 -8
- data/lib/mongoid/contexts/ids.rb +0 -25
- data/lib/mongoid/modifiers.rb +0 -24
- data/lib/mongoid/modifiers/command.rb +0 -18
- data/lib/mongoid/modifiers/inc.rb +0 -24
data/lib/mongoid/document.rb
CHANGED
@@ -113,7 +113,7 @@ module Mongoid #:nodoc:
|
|
113
113
|
# @return [ Document ] A new document.
|
114
114
|
def initialize(attrs = nil)
|
115
115
|
@new_record = true
|
116
|
-
@attributes =
|
116
|
+
@attributes = apply_default_attributes
|
117
117
|
process(attrs) do |document|
|
118
118
|
yield self if block_given?
|
119
119
|
identify
|
@@ -147,6 +147,7 @@ module Mongoid #:nodoc:
|
|
147
147
|
raise Errors::DocumentNotFound.new(self.class, id) if reloaded.nil?
|
148
148
|
end
|
149
149
|
@attributes = {}.merge(reloaded || {})
|
150
|
+
apply_default_attributes
|
150
151
|
reset_modifications
|
151
152
|
tap do
|
152
153
|
relations.keys.each do |name|
|
@@ -233,7 +234,9 @@ module Mongoid #:nodoc:
|
|
233
234
|
if attributes["_id"]
|
234
235
|
allocate.tap do |doc|
|
235
236
|
doc.instance_variable_set(:@attributes, attributes)
|
237
|
+
doc.send(:apply_default_attributes)
|
236
238
|
doc.setup_modifications
|
239
|
+
doc.run_callbacks(:initialize) { doc }
|
237
240
|
end
|
238
241
|
else
|
239
242
|
new(attrs)
|
@@ -255,5 +258,27 @@ module Mongoid #:nodoc:
|
|
255
258
|
:mongoid
|
256
259
|
end
|
257
260
|
end
|
261
|
+
|
262
|
+
# Freezes the internal attributes of the document.
|
263
|
+
#
|
264
|
+
# @example Freeze the document
|
265
|
+
# document.freeze
|
266
|
+
#
|
267
|
+
# @return [ Document ] The document.
|
268
|
+
def freeze
|
269
|
+
raw_attributes.freeze
|
270
|
+
self
|
271
|
+
end
|
272
|
+
|
273
|
+
# Checks if the document is frozen
|
274
|
+
#
|
275
|
+
# @example Check if frozen
|
276
|
+
# document.frozen?
|
277
|
+
#
|
278
|
+
# @return [ true, false ] True if frozen, else false.
|
279
|
+
def frozen?
|
280
|
+
raw_attributes.frozen?
|
281
|
+
end
|
282
|
+
|
258
283
|
end
|
259
284
|
end
|
data/lib/mongoid/errors.rb
CHANGED
@@ -6,6 +6,7 @@ require "mongoid/errors/invalid_database"
|
|
6
6
|
require "mongoid/errors/invalid_field"
|
7
7
|
require "mongoid/errors/invalid_options"
|
8
8
|
require "mongoid/errors/invalid_type"
|
9
|
+
require "mongoid/errors/mixed_relations"
|
9
10
|
require "mongoid/errors/too_many_nested_attribute_records"
|
10
11
|
require "mongoid/errors/unsaved_document"
|
11
12
|
require "mongoid/errors/unsupported_version"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Errors #:nodoc
|
4
|
+
|
5
|
+
# This error is raised when trying to reference an embedded document from
|
6
|
+
# a document in another collection that is not it's parent.
|
7
|
+
#
|
8
|
+
# @example An illegal reference to an embedded document.
|
9
|
+
# class Post
|
10
|
+
# include Mongoid::Document
|
11
|
+
# references_many :addresses
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# class Address
|
15
|
+
# include Mongoid::Document
|
16
|
+
# embedded_in :person
|
17
|
+
# referenced_in :post
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
class MixedRelations < MongoidError
|
22
|
+
|
23
|
+
attr_reader :root_klass, :embedded_klass
|
24
|
+
|
25
|
+
def initialize(root_klass, embedded_klass)
|
26
|
+
@root_klass, @embedded_klass = root_klass, embedded_klass
|
27
|
+
|
28
|
+
super(
|
29
|
+
translate(
|
30
|
+
"mixed_relations",
|
31
|
+
{ :root => root_klass, :embedded => embedded_klass }
|
32
|
+
)
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -42,6 +42,8 @@ module Mongoid #:nodoc:
|
|
42
42
|
# Convert the supplied arguments to object ids based on the class
|
43
43
|
# settings.
|
44
44
|
#
|
45
|
+
# @todo Durran: This method can be refactored.
|
46
|
+
#
|
45
47
|
# @example Convert a string to an object id
|
46
48
|
# BSON::ObjectId.convert(Person, "4c52c439931a90ab29000003")
|
47
49
|
#
|
@@ -64,16 +66,17 @@ module Mongoid #:nodoc:
|
|
64
66
|
return args if args.is_a?(BSON::ObjectId) || !klass.using_object_ids?
|
65
67
|
case args
|
66
68
|
when ::String
|
67
|
-
BSON::ObjectId.from_string(args)
|
69
|
+
args.blank? ? nil : BSON::ObjectId.from_string(args)
|
68
70
|
when ::Array
|
69
|
-
args.map do |arg|
|
71
|
+
args.reject(&:blank?).map do |arg|
|
70
72
|
convert(klass, arg)
|
71
73
|
end
|
72
74
|
when ::Hash
|
73
75
|
args.tap do |hash|
|
74
|
-
|
76
|
+
hash.each_pair do |key, value|
|
77
|
+
next unless key.to_s =~ /id/
|
75
78
|
begin
|
76
|
-
|
79
|
+
hash[key] = convert(klass, value)
|
77
80
|
rescue BSON::InvalidObjectId; end
|
78
81
|
end
|
79
82
|
end
|
data/lib/mongoid/factory.rb
CHANGED
@@ -14,7 +14,7 @@ module Mongoid #:nodoc:
|
|
14
14
|
def self.build(klass, attributes)
|
15
15
|
attrs = {}.merge(attributes)
|
16
16
|
type = attrs["_type"]
|
17
|
-
type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
|
17
|
+
type.present? ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
data/lib/mongoid/field.rb
CHANGED
@@ -1,34 +1,40 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
|
+
|
4
|
+
# Defines the behaviour for defined fields in the document.
|
3
5
|
class Field
|
4
|
-
|
6
|
+
|
7
|
+
attr_accessor :type
|
8
|
+
attr_reader :copyable, :klass, :label, :name, :options
|
5
9
|
|
6
10
|
# Get the default value for the field.
|
7
11
|
#
|
8
|
-
#
|
12
|
+
# @example Get the default.
|
13
|
+
# field.default
|
9
14
|
#
|
10
|
-
# The typecast default value.
|
15
|
+
# @return [ Object ] The typecast default value.
|
16
|
+
#
|
17
|
+
# @since 1.0.0
|
11
18
|
def default
|
12
19
|
copy.respond_to?(:call) ? copy : set(copy)
|
13
20
|
end
|
14
21
|
|
15
|
-
# Create the new field with a name and optional additional options.
|
16
|
-
# options are :default
|
22
|
+
# Create the new field with a name and optional additional options.
|
17
23
|
#
|
18
|
-
#
|
24
|
+
# @example Create the new field.
|
25
|
+
# Field.new(:name, :type => String)
|
19
26
|
#
|
20
|
-
#
|
21
|
-
# options: A +Hash+ of options for the field.
|
27
|
+
# @param [ Hash ] options The field options.
|
22
28
|
#
|
23
|
-
#
|
29
|
+
# @option options [ Class ] :type The class of the field.
|
30
|
+
# @option options [ Object ] :default The default value for the field.
|
31
|
+
# @option options [ String ] :label The field's label.
|
24
32
|
#
|
25
|
-
#
|
33
|
+
# @since 1.0.0
|
26
34
|
def initialize(name, options = {})
|
27
|
-
check_name!(name)
|
28
35
|
@type = options[:type] || Object
|
29
|
-
@name, @default = name, options[:default]
|
36
|
+
@name, @default, @label = name, options[:default], options[:label]
|
30
37
|
@copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
|
31
|
-
@label = options[:label]
|
32
38
|
@options = options
|
33
39
|
check_default!
|
34
40
|
end
|
@@ -40,19 +46,20 @@ module Mongoid #:nodoc:
|
|
40
46
|
# If the field is an identity field, ie an id, it performs the necessary
|
41
47
|
# cast.
|
42
48
|
#
|
43
|
-
#
|
49
|
+
# @example Get the setter value.
|
50
|
+
# field.set("New Value")
|
44
51
|
#
|
45
|
-
#
|
52
|
+
# @param [ Object ] object The value to cast to a database value.
|
46
53
|
#
|
47
|
-
#
|
54
|
+
# @return [ Object ] The typecast value.
|
48
55
|
#
|
49
|
-
#
|
56
|
+
# @since 1.0.0
|
50
57
|
def set(object)
|
51
58
|
unless options[:identity]
|
52
59
|
type.set(object)
|
53
60
|
else
|
54
61
|
if object.blank?
|
55
|
-
type.set(object)
|
62
|
+
type.set(object) if object.is_a?(Array)
|
56
63
|
else
|
57
64
|
options[:metadata].constraint.convert(object)
|
58
65
|
end
|
@@ -61,30 +68,40 @@ module Mongoid #:nodoc:
|
|
61
68
|
|
62
69
|
# Used for retrieving the object out of the attributes hash.
|
63
70
|
#
|
64
|
-
#
|
71
|
+
# @example Get the value.
|
72
|
+
# field.get("Value")
|
65
73
|
#
|
66
|
-
#
|
74
|
+
# @param [ Object ] The object to cast from the database.
|
67
75
|
#
|
68
|
-
#
|
76
|
+
# @return [ Object ] The converted value.
|
69
77
|
#
|
70
|
-
#
|
78
|
+
# @since 1.0.0
|
71
79
|
def get(object)
|
72
80
|
type.get(object)
|
73
81
|
end
|
74
82
|
|
75
83
|
protected
|
76
|
-
|
84
|
+
|
85
|
+
# Copy the default value if copyable.
|
86
|
+
#
|
87
|
+
# @example Copy the default.
|
88
|
+
# field.copy
|
89
|
+
#
|
90
|
+
# @return [ Object ] The copied object or the original.
|
91
|
+
#
|
92
|
+
# @since 1.0.0
|
77
93
|
def copy
|
78
94
|
copyable ? @default.dup : @default
|
79
95
|
end
|
80
96
|
|
81
|
-
#
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
97
|
+
# Checks if the default value is of the same type as the field.
|
98
|
+
#
|
99
|
+
# @example Check the default value.
|
100
|
+
# field.check_default!
|
101
|
+
#
|
102
|
+
# @raise [ Errors::InvalidType ] If the types differ.
|
103
|
+
#
|
104
|
+
# @since 1.0.0
|
88
105
|
def check_default!
|
89
106
|
return if @default.is_a?(Proc)
|
90
107
|
if !@default.nil? && !@default.is_a?(type)
|
data/lib/mongoid/fields.rb
CHANGED
@@ -9,11 +9,17 @@ module Mongoid #:nodoc
|
|
9
9
|
# Set up the class attributes that must be available to all subclasses.
|
10
10
|
# These include defaults, fields
|
11
11
|
delegate :defaults, :fields, :to => "self.class"
|
12
|
+
|
13
|
+
field(:_type, :type => String)
|
14
|
+
field(:_id, :type => BSON::ObjectId)
|
15
|
+
|
16
|
+
alias :id :_id
|
17
|
+
alias :id= :_id=
|
12
18
|
end
|
13
19
|
|
14
20
|
module ClassMethods #:nodoc
|
15
21
|
|
16
|
-
# Defines all the fields that are
|
22
|
+
# Defines all the fields that are accessible on the Document
|
17
23
|
# For each field that is defined, a getter and setter will be
|
18
24
|
# added as an instance method to the Document.
|
19
25
|
#
|
@@ -71,7 +77,7 @@ module Mongoid #:nodoc
|
|
71
77
|
end
|
72
78
|
|
73
79
|
# When inheriting, we want to copy the fields from the parent class and
|
74
|
-
# set the on the child to start,
|
80
|
+
# set the on the child to start, mimicking the behaviour of the old
|
75
81
|
# class_inheritable_accessor that was deprecated in Rails edge.
|
76
82
|
#
|
77
83
|
# @example Inherit from this class.
|
@@ -81,6 +87,7 @@ module Mongoid #:nodoc
|
|
81
87
|
#
|
82
88
|
# @since 2.0.0.rc.6
|
83
89
|
def inherited(subclass)
|
90
|
+
super
|
84
91
|
subclass.fields = fields.dup
|
85
92
|
end
|
86
93
|
|
data/lib/mongoid/finders.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
|
-
|
3
|
+
|
4
|
+
# This module defines the finder methods that hang off the document at the
|
5
|
+
# class level.
|
6
|
+
module Finders
|
4
7
|
|
5
8
|
# Delegate to the criteria methods that are natural for creating a new
|
6
9
|
# criteria.
|
7
10
|
[ :all_in, :any_in, :any_of, :asc, :ascending, :avg, :desc, :descending,
|
8
11
|
:excludes, :limit, :max, :min, :not_in, :only, :order_by,
|
9
|
-
:skip, :sum, :where, :update, :update_all, :near ].each do |name|
|
12
|
+
:skip, :sum, :without, :where, :update, :update_all, :near ].each do |name|
|
10
13
|
define_method(name) do |*args|
|
11
14
|
criteria.send(name, *args)
|
12
15
|
end
|
@@ -28,7 +31,7 @@ module Mongoid #:nodoc:
|
|
28
31
|
#
|
29
32
|
# <tt>Person.count(:conditions => { :attribute => "value" })</tt>
|
30
33
|
def count(*args)
|
31
|
-
|
34
|
+
find(:all, *args).count
|
32
35
|
end
|
33
36
|
|
34
37
|
# Returns true if there are on document in database based on the
|
@@ -36,17 +39,7 @@ module Mongoid #:nodoc:
|
|
36
39
|
#
|
37
40
|
# <tt>Person.exists?(:conditions => { :attribute => "value" })</tt>
|
38
41
|
def exists?(*args)
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
# Helper to initialize a new +Criteria+ object for this class, or return
|
43
|
-
# the currently scoped +Criteria+ object.
|
44
|
-
#
|
45
|
-
# Example:
|
46
|
-
#
|
47
|
-
# <tt>Person.criteria</tt>
|
48
|
-
def criteria(embedded = false)
|
49
|
-
scope_stack.last || Criteria.new(self, embedded)
|
42
|
+
find(:all, *args).limit(1).count == 1
|
50
43
|
end
|
51
44
|
|
52
45
|
# Find a +Document+ in several different ways.
|
@@ -71,16 +64,7 @@ module Mongoid #:nodoc:
|
|
71
64
|
#
|
72
65
|
# A document or criteria.
|
73
66
|
def find(*args)
|
74
|
-
|
75
|
-
:calling_document_find_with_nil_is_invalid, {}
|
76
|
-
) if args[0].nil?
|
77
|
-
type, criteria = Criteria.parse!(self, false, *args)
|
78
|
-
case type
|
79
|
-
when :first then return criteria.one
|
80
|
-
when :last then return criteria.last
|
81
|
-
else
|
82
|
-
return criteria
|
83
|
-
end
|
67
|
+
criteria.find(*args)
|
84
68
|
end
|
85
69
|
|
86
70
|
# Find the first +Document+ given the conditions, or creates a new document
|
@@ -91,8 +75,8 @@ module Mongoid #:nodoc:
|
|
91
75
|
# args: A +Hash+ of attributes
|
92
76
|
#
|
93
77
|
# <tt>Person.find_or_create_by(:attribute => "value")</tt>
|
94
|
-
def find_or_create_by(attrs = {})
|
95
|
-
find_or(:create, attrs)
|
78
|
+
def find_or_create_by(attrs = {}, &block)
|
79
|
+
find_or(:create, attrs, &block)
|
96
80
|
end
|
97
81
|
|
98
82
|
# Find the first +Document+ given the conditions, or instantiates a new document
|
@@ -103,8 +87,8 @@ module Mongoid #:nodoc:
|
|
103
87
|
# args: A +Hash+ of attributes
|
104
88
|
#
|
105
89
|
# <tt>Person.find_or_initialize_by(:attribute => "value")</tt>
|
106
|
-
def find_or_initialize_by(attrs = {})
|
107
|
-
find_or(:new, attrs)
|
90
|
+
def find_or_initialize_by(attrs = {}, &block)
|
91
|
+
find_or(:new, attrs, &block)
|
108
92
|
end
|
109
93
|
|
110
94
|
# Find the first +Document+ given the conditions.
|
@@ -143,31 +127,13 @@ module Mongoid #:nodoc:
|
|
143
127
|
#
|
144
128
|
# Returns paginated array of docs.
|
145
129
|
def paginate(params = {})
|
146
|
-
|
130
|
+
find(:all, params).paginate
|
147
131
|
end
|
148
132
|
|
149
133
|
protected
|
150
134
|
# Find the first object or create/initialize it.
|
151
|
-
def find_or(method, attrs = {})
|
152
|
-
first(:conditions => attrs) || send(method, attrs)
|
153
|
-
end
|
154
|
-
|
155
|
-
# Initializes and returns the current scope stack.
|
156
|
-
def scope_stack
|
157
|
-
scope_stack_for = Thread.current[:mongoid_scope_stack] ||= {}
|
158
|
-
scope_stack_for[object_id] ||= []
|
159
|
-
end
|
160
|
-
|
161
|
-
# Pushes the provided criteria onto the scope stack, and removes it after the
|
162
|
-
# provided block is yielded.
|
163
|
-
def with_scope(criteria)
|
164
|
-
scope_stack = self.scope_stack
|
165
|
-
scope_stack << criteria
|
166
|
-
begin
|
167
|
-
yield criteria
|
168
|
-
ensure
|
169
|
-
scope_stack.pop
|
170
|
-
end
|
135
|
+
def find_or(method, attrs = {}, &block)
|
136
|
+
first(:conditions => attrs) || send(method, attrs, &block)
|
171
137
|
end
|
172
138
|
end
|
173
139
|
end
|
data/lib/mongoid/identity.rb
CHANGED
@@ -12,8 +12,7 @@ module Mongoid #:nodoc:
|
|
12
12
|
# @example Create the id and set the type.
|
13
13
|
# identity.create
|
14
14
|
def create
|
15
|
-
identify
|
16
|
-
type
|
15
|
+
identify.tap { type }
|
17
16
|
end
|
18
17
|
|
19
18
|
# Create the new identity generator - this will be expanded in the future
|
@@ -49,8 +48,11 @@ module Mongoid #:nodoc:
|
|
49
48
|
# @example Set the id.
|
50
49
|
# identity.identify
|
51
50
|
def identify
|
52
|
-
document.
|
53
|
-
|
51
|
+
if !document.embedded? || Mongoid.embedded_object_id
|
52
|
+
document.id = compose.join(" ").identify if document.primary_key
|
53
|
+
document.id = generate_id if document.id.blank?
|
54
|
+
end
|
55
|
+
document.id
|
54
56
|
end
|
55
57
|
|
56
58
|
# Set the _type field on the document if the document is hereditary or in a
|