mongoid 2.0.0.alpha → 2.0.0.beta.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mongoid.rb +11 -5
- data/lib/mongoid/associations.rb +112 -107
- data/lib/mongoid/associations/belongs_to_related.rb +2 -3
- data/lib/mongoid/associations/embedded_in.rb +12 -4
- data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
- data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
- data/lib/mongoid/associations/has_many_related.rb +51 -5
- data/lib/mongoid/associations/has_one_related.rb +9 -5
- data/lib/mongoid/associations/meta_data.rb +2 -1
- data/lib/mongoid/associations/options.rb +15 -6
- data/lib/mongoid/associations/proxy.rb +14 -21
- data/lib/mongoid/attributes.rb +34 -13
- data/lib/mongoid/callbacks.rb +1 -2
- data/lib/mongoid/collection.rb +4 -3
- data/lib/mongoid/collections.rb +41 -0
- data/lib/mongoid/collections/master.rb +3 -2
- data/lib/mongoid/collections/slaves.rb +3 -2
- data/lib/mongoid/components.rb +4 -1
- data/lib/mongoid/config.rb +163 -13
- data/lib/mongoid/contexts.rb +1 -2
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +10 -2
- data/lib/mongoid/criteria.rb +13 -22
- data/lib/mongoid/criterion/exclusion.rb +3 -3
- data/lib/mongoid/criterion/inclusion.rb +17 -0
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +40 -85
- data/lib/mongoid/errors.rb +48 -1
- data/lib/mongoid/extensions.rb +11 -9
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
- data/lib/mongoid/extensions/date/conversions.rb +13 -4
- data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
- data/lib/mongoid/extensions/float/conversions.rb +5 -1
- data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
- data/lib/mongoid/extensions/hash/conversions.rb +34 -4
- data/lib/mongoid/extensions/integer/conversions.rb +5 -1
- data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
- data/lib/mongoid/extensions/object/conversions.rb +3 -3
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/field.rb +15 -2
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/identity.rb +3 -3
- data/lib/mongoid/indexes.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -2
- data/lib/mongoid/memoization.rb +8 -2
- data/lib/mongoid/named_scope.rb +0 -5
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +30 -22
- data/lib/mongoid/persistence.rb +218 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +47 -0
- data/lib/mongoid/persistence/insert_embedded.rb +38 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +37 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +63 -0
- data/lib/mongoid/railtie.rb +53 -0
- data/lib/mongoid/railties/database.rake +37 -0
- data/lib/mongoid/timestamps.rb +2 -2
- data/lib/mongoid/validations.rb +2 -2
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +13 -2
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +3 -2
- data/lib/rails/generators/mongoid/config/config_generator.rb +41 -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
- metadata +76 -301
- data/.gitignore +0 -6
- data/.watchr +0 -29
- data/Rakefile +0 -52
- data/VERSION +0 -1
- data/caliper.yml +0 -4
- data/lib/mongoid/collections/mimic.rb +0 -46
- data/lib/mongoid/commands.rb +0 -161
- data/lib/mongoid/commands/create.rb +0 -19
- data/lib/mongoid/commands/delete.rb +0 -16
- data/lib/mongoid/commands/delete_all.rb +0 -23
- data/lib/mongoid/commands/deletion.rb +0 -18
- data/lib/mongoid/commands/destroy.rb +0 -17
- data/lib/mongoid/commands/destroy_all.rb +0 -23
- data/lib/mongoid/commands/save.rb +0 -29
- data/lib/mongoid/extensions/time/conversions.rb +0 -18
- data/mongoid.gemspec +0 -408
- data/perf/benchmark.rb +0 -77
- data/spec/integration/mongoid/associations_spec.rb +0 -340
- data/spec/integration/mongoid/attributes_spec.rb +0 -22
- data/spec/integration/mongoid/commands_spec.rb +0 -227
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
- data/spec/integration/mongoid/criteria_spec.rb +0 -272
- data/spec/integration/mongoid/document_spec.rb +0 -650
- data/spec/integration/mongoid/extensions_spec.rb +0 -22
- data/spec/integration/mongoid/finders_spec.rb +0 -119
- data/spec/integration/mongoid/inheritance_spec.rb +0 -137
- data/spec/integration/mongoid/named_scope_spec.rb +0 -46
- data/spec/models/address.rb +0 -39
- data/spec/models/animal.rb +0 -6
- data/spec/models/callbacks.rb +0 -18
- data/spec/models/comment.rb +0 -8
- data/spec/models/country_code.rb +0 -6
- data/spec/models/employer.rb +0 -5
- data/spec/models/game.rb +0 -7
- data/spec/models/inheritance.rb +0 -56
- data/spec/models/location.rb +0 -5
- data/spec/models/mixed_drink.rb +0 -4
- data/spec/models/name.rb +0 -13
- data/spec/models/namespacing.rb +0 -11
- data/spec/models/patient.rb +0 -4
- data/spec/models/person.rb +0 -99
- data/spec/models/pet.rb +0 -7
- data/spec/models/pet_owner.rb +0 -6
- data/spec/models/phone.rb +0 -7
- data/spec/models/post.rb +0 -15
- data/spec/models/translation.rb +0 -5
- data/spec/models/vet_visit.rb +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
- data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
- data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
- data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
- data/spec/unit/mongoid/associations/options_spec.rb +0 -192
- data/spec/unit/mongoid/associations_spec.rb +0 -595
- data/spec/unit/mongoid/attributes_spec.rb +0 -507
- data/spec/unit/mongoid/callbacks_spec.rb +0 -55
- data/spec/unit/mongoid/collection_spec.rb +0 -187
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
- data/spec/unit/mongoid/collections/master_spec.rb +0 -41
- data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
- data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
- data/spec/unit/mongoid/commands/create_spec.rb +0 -31
- data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
- data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
- data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
- data/spec/unit/mongoid/commands/save_spec.rb +0 -107
- data/spec/unit/mongoid/commands_spec.rb +0 -270
- data/spec/unit/mongoid/config_spec.rb +0 -172
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
- data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
- data/spec/unit/mongoid/contexts_spec.rb +0 -25
- data/spec/unit/mongoid/criteria_spec.rb +0 -824
- data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
- data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
- data/spec/unit/mongoid/cursor_spec.rb +0 -74
- data/spec/unit/mongoid/deprecation_spec.rb +0 -24
- data/spec/unit/mongoid/document_spec.rb +0 -818
- data/spec/unit/mongoid/errors_spec.rb +0 -103
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
- data/spec/unit/mongoid/extras_spec.rb +0 -102
- data/spec/unit/mongoid/factory_spec.rb +0 -31
- data/spec/unit/mongoid/field_spec.rb +0 -143
- data/spec/unit/mongoid/fields_spec.rb +0 -181
- data/spec/unit/mongoid/finders_spec.rb +0 -404
- data/spec/unit/mongoid/identity_spec.rb +0 -109
- data/spec/unit/mongoid/indexes_spec.rb +0 -93
- data/spec/unit/mongoid/javascript_spec.rb +0 -48
- data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
- data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
- data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
- data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
- data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
- data/spec/unit/mongoid/matchers_spec.rb +0 -329
- data/spec/unit/mongoid/memoization_spec.rb +0 -75
- data/spec/unit/mongoid/named_scope_spec.rb +0 -123
- data/spec/unit/mongoid/observable_spec.rb +0 -46
- data/spec/unit/mongoid/paths_spec.rb +0 -124
- data/spec/unit/mongoid/scope_spec.rb +0 -240
- data/spec/unit/mongoid/state_spec.rb +0 -83
- data/spec/unit/mongoid/timestamps_spec.rb +0 -25
- data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
- data/spec/unit/mongoid/validations_spec.rb +0 -190
- data/spec/unit/mongoid/versioning_spec.rb +0 -41
- data/spec/unit/mongoid_spec.rb +0 -46
data/lib/mongoid/errors.rb
CHANGED
@@ -41,6 +41,20 @@ module Mongoid #:nodoc
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
# Raised when the database version is not supported by Mongoid.
|
45
|
+
#
|
46
|
+
# Example:
|
47
|
+
#
|
48
|
+
# <tt>UnsupportedVersion.new(Mongo::ServerVersion.new("1.3.1"))</tt>
|
49
|
+
class UnsupportedVersion < RuntimeError
|
50
|
+
def initialize(version)
|
51
|
+
@version = version
|
52
|
+
end
|
53
|
+
def message
|
54
|
+
"MongoDB #{@version} not supported, please upgrade to #{Mongoid::MONGODB_VERSION}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
44
58
|
# Raised when a persisence method ending in ! fails validation. The message
|
45
59
|
# will contain the full error messages from the +Document+ in question.
|
46
60
|
#
|
@@ -52,7 +66,7 @@ module Mongoid #:nodoc
|
|
52
66
|
@errors = errors
|
53
67
|
end
|
54
68
|
def message
|
55
|
-
"Validation
|
69
|
+
"Validation Failed: " + @errors.full_messages.join(", ")
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
@@ -73,5 +87,38 @@ module Mongoid #:nodoc
|
|
73
87
|
end
|
74
88
|
end
|
75
89
|
|
90
|
+
# This error is raised when trying to create a field that conflicts with
|
91
|
+
# a Mongoid internal attribute or method.
|
92
|
+
#
|
93
|
+
# Example:
|
94
|
+
#
|
95
|
+
# <tt>InvalidField.new('collection')</tt>
|
96
|
+
class InvalidField < RuntimeError
|
97
|
+
def initialize(name)
|
98
|
+
@name = name
|
99
|
+
end
|
100
|
+
def message
|
101
|
+
"Defining a field named '#{@name}' is not allowed. " +
|
102
|
+
"Do not define fields that conflict with Mongoid internal attributes " +
|
103
|
+
"or method names. Use Document#instance_methods to see what " +
|
104
|
+
"names this includes."
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# This error is raised when trying to create set nested records above the
|
109
|
+
# specified :limit
|
110
|
+
#
|
111
|
+
# Example:
|
112
|
+
#
|
113
|
+
#<tt>TooManyNestedAttributeRecords.new('association', limit)
|
114
|
+
class TooManyNestedAttributeRecords < RuntimeError
|
115
|
+
def initialize(association, limit)
|
116
|
+
@association = association.to_s.humanize.capitalize
|
117
|
+
@limit = limit
|
118
|
+
end
|
119
|
+
def message
|
120
|
+
"Accept Nested Attributes for #{@association} is limited to #{@limit} records"
|
121
|
+
end
|
122
|
+
end
|
76
123
|
end
|
77
124
|
end
|
data/lib/mongoid/extensions.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "mongoid/extensions/time_conversions"
|
2
3
|
require "mongoid/extensions/array/accessors"
|
3
4
|
require "mongoid/extensions/array/aliasing"
|
4
5
|
require "mongoid/extensions/array/assimilation"
|
@@ -22,7 +23,6 @@ require "mongoid/extensions/proc/scoping"
|
|
22
23
|
require "mongoid/extensions/string/conversions"
|
23
24
|
require "mongoid/extensions/string/inflections"
|
24
25
|
require "mongoid/extensions/symbol/inflections"
|
25
|
-
require "mongoid/extensions/time/conversions"
|
26
26
|
require "mongoid/extensions/objectid/conversions"
|
27
27
|
|
28
28
|
class Array #:nodoc
|
@@ -44,14 +44,16 @@ class Boolean #:nodoc
|
|
44
44
|
extend Mongoid::Extensions::Boolean::Conversions
|
45
45
|
end
|
46
46
|
|
47
|
-
class Date #:nodoc
|
48
|
-
extend Mongoid::Extensions::Date::Conversions
|
49
|
-
end
|
50
|
-
|
51
47
|
class DateTime #:nodoc
|
48
|
+
extend Mongoid::Extensions::TimeConversions
|
52
49
|
extend Mongoid::Extensions::DateTime::Conversions
|
53
50
|
end
|
54
51
|
|
52
|
+
class Date #:nodoc
|
53
|
+
extend Mongoid::Extensions::TimeConversions
|
54
|
+
extend Mongoid::Extensions::Date::Conversions
|
55
|
+
end
|
56
|
+
|
55
57
|
class Float #:nodoc
|
56
58
|
extend Mongoid::Extensions::Float::Conversions
|
57
59
|
end
|
@@ -61,7 +63,7 @@ class Hash #:nodoc
|
|
61
63
|
include Mongoid::Extensions::Hash::Assimilation
|
62
64
|
include Mongoid::Extensions::Hash::CriteriaHelpers
|
63
65
|
include Mongoid::Extensions::Hash::Scoping
|
64
|
-
|
66
|
+
include Mongoid::Extensions::Hash::Conversions
|
65
67
|
end
|
66
68
|
|
67
69
|
class Integer #:nodoc
|
@@ -91,9 +93,9 @@ class Symbol #:nodoc
|
|
91
93
|
end
|
92
94
|
|
93
95
|
class Time #:nodoc
|
94
|
-
extend Mongoid::Extensions::
|
96
|
+
extend Mongoid::Extensions::TimeConversions
|
95
97
|
end
|
96
98
|
|
97
|
-
class
|
99
|
+
class BSON::ObjectID #:nodoc
|
98
100
|
extend Mongoid::Extensions::ObjectID::Conversions
|
99
|
-
end
|
101
|
+
end
|
@@ -7,11 +7,11 @@ module Mongoid #:nodoc:
|
|
7
7
|
module Conversions #:nodoc:
|
8
8
|
# Get the string as a +BigDecimal+
|
9
9
|
def get(value)
|
10
|
-
::BigDecimal.new(value)
|
10
|
+
value ? ::BigDecimal.new(value) : value
|
11
11
|
end
|
12
12
|
# Set the value in the hash as a string.
|
13
13
|
def set(value)
|
14
|
-
value.to_s
|
14
|
+
value ? value.to_s : value
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -3,9 +3,15 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Boolean #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
+
|
7
|
+
BOOLEAN_MAP = {
|
8
|
+
true => true, "true" => true, "TRUE" => true, "1" => true, 1 => true, 1.0 => true,
|
9
|
+
false => false, "false" => false, "FALSE" => false, "0" => false, 0 => false, 0.0 => false
|
10
|
+
}
|
11
|
+
|
6
12
|
def set(value)
|
7
|
-
|
8
|
-
|
13
|
+
value = BOOLEAN_MAP[value]
|
14
|
+
value.nil? ? nil : value
|
9
15
|
end
|
10
16
|
def get(value)
|
11
17
|
value
|
@@ -3,11 +3,20 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Date #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
def set(value)
|
7
|
-
value.to_date.at_midnight.to_time unless value.blank?
|
8
|
-
end
|
9
6
|
def get(value)
|
10
|
-
|
7
|
+
return nil if value.blank?
|
8
|
+
if Mongoid::Config.instance.use_utc?
|
9
|
+
value.to_date
|
10
|
+
else
|
11
|
+
::Date.new(value.year, value.month, value.day)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def convert_to_time(value)
|
18
|
+
value = ::Date.parse(value) if value.is_a?(::String)
|
19
|
+
::Time.utc(value.year, value.month, value.day)
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
@@ -3,13 +3,8 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module DateTime #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
def set(value)
|
7
|
-
return nil if value.blank?
|
8
|
-
::DateTime.parse(value.to_s).utc
|
9
|
-
end
|
10
6
|
def get(value)
|
11
|
-
|
12
|
-
::Time.zone ? ::Time.parse(value.to_s).getlocal.to_datetime : value.to_datetime
|
7
|
+
super.try(:to_datetime)
|
13
8
|
end
|
14
9
|
end
|
15
10
|
end
|
@@ -18,10 +18,19 @@ module Mongoid #:nodoc:
|
|
18
18
|
#
|
19
19
|
# Returns: The child +Document+.
|
20
20
|
def assimilate(parent, options, type = nil)
|
21
|
-
klass = type ? type : options.klass
|
22
|
-
child = klass.instantiate(
|
23
|
-
|
21
|
+
klass = self.klass || (type ? type : options.klass)
|
22
|
+
child = klass.instantiate("_id" => self["_id"])
|
23
|
+
self.merge("_type" => klass.name) if klass.hereditary
|
24
|
+
init(parent, child, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def init(parent, child, options)
|
30
|
+
child._parent = parent
|
31
|
+
child.write_attributes(self)
|
24
32
|
child.identify
|
33
|
+
child.reset_modifications
|
25
34
|
child.assimilate(parent, options)
|
26
35
|
end
|
27
36
|
end
|
@@ -3,11 +3,41 @@ module Mongoid #:nodoc:
|
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Hash #:nodoc:
|
5
5
|
module Conversions #:nodoc:
|
6
|
-
|
7
|
-
|
6
|
+
extend ActiveSupport::Concern
|
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
|
8
32
|
end
|
9
|
-
|
10
|
-
|
33
|
+
|
34
|
+
module ClassMethods #:nodoc:
|
35
|
+
def get(value)
|
36
|
+
value
|
37
|
+
end
|
38
|
+
def set(value)
|
39
|
+
value
|
40
|
+
end
|
11
41
|
end
|
12
42
|
end
|
13
43
|
end
|
@@ -5,7 +5,11 @@ module Mongoid #:nodoc:
|
|
5
5
|
module Conversions #:nodoc:
|
6
6
|
def set(value)
|
7
7
|
return nil if value.blank?
|
8
|
-
|
8
|
+
begin
|
9
|
+
Integer(value)
|
10
|
+
rescue ArgumentError => e
|
11
|
+
puts(e.message); value
|
12
|
+
end
|
9
13
|
end
|
10
14
|
def get(value)
|
11
15
|
value
|
@@ -8,17 +8,17 @@ module Mongoid #:nodoc:
|
|
8
8
|
module InstanceMethods
|
9
9
|
# Converts this object to a hash of attributes
|
10
10
|
def mongoidize
|
11
|
-
self.
|
11
|
+
self.raw_attributes
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
module ClassMethods
|
16
16
|
def set(value)
|
17
|
-
value.respond_to?(:
|
17
|
+
value.respond_to?(:raw_attributes) ? value.raw_attributes : value
|
18
18
|
end
|
19
19
|
|
20
20
|
def get(value)
|
21
|
-
self.
|
21
|
+
value ? self.instantiate(value) : value
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -23,9 +23,12 @@ module Mongoid #:nodoc:
|
|
23
23
|
to_s.plural?
|
24
24
|
end
|
25
25
|
|
26
|
-
["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all",
|
26
|
+
[ "gt", "lt", "gte", "lte", "ne", "near", "in", "nin", "mod", "all",
|
27
|
+
"size", "exists", "within", ["matches","elemMatch"] ].each do |oper|
|
28
|
+
m, oper = oper
|
29
|
+
oper = m unless oper
|
27
30
|
class_eval <<-OPERATORS
|
28
|
-
def #{
|
31
|
+
def #{m}
|
29
32
|
Criterion::Complex.new(:key => self, :operator => "#{oper}")
|
30
33
|
end
|
31
34
|
OPERATORS
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Mongoid #:nodoc:
|
2
|
+
module Extensions #:nodoc:
|
3
|
+
module TimeConversions #:nodoc:
|
4
|
+
def set(value)
|
5
|
+
return nil if value.blank?
|
6
|
+
time = convert_to_time(value)
|
7
|
+
strip_milliseconds(time).utc
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(value)
|
11
|
+
return nil if value.blank?
|
12
|
+
if Mongoid::Config.instance.use_utc?
|
13
|
+
value
|
14
|
+
else
|
15
|
+
value.getlocal
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def strip_milliseconds(time)
|
22
|
+
::Time.at(time.to_i)
|
23
|
+
end
|
24
|
+
|
25
|
+
def convert_to_time(value)
|
26
|
+
case value
|
27
|
+
when ::String then ::Time.parse(value)
|
28
|
+
when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
|
29
|
+
when ::Date then ::Time.utc(value.year, value.month, value.day)
|
30
|
+
else value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/mongoid/factory.rb
CHANGED
@@ -11,7 +11,8 @@ 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,
|
14
|
+
def self.build(klass, attributes)
|
15
|
+
attrs = {}.merge(attributes)
|
15
16
|
type = attrs["_type"]
|
16
17
|
type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
|
17
18
|
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
|
+
copy
|
22
22
|
end
|
23
23
|
|
24
24
|
# Create the new field with a name and optional additional options. Valid
|
@@ -33,7 +33,9 @@ module Mongoid #:nodoc:
|
|
33
33
|
#
|
34
34
|
# <tt>Field.new(:score, :default => 0)</tt>
|
35
35
|
def initialize(name, options = {})
|
36
|
+
check_name!(name)
|
36
37
|
@name, @default = name, options[:default]
|
38
|
+
@copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
|
37
39
|
@type = options[:type] || String
|
38
40
|
@accessible = options.has_key?(:accessible) ? options[:accessible] : true
|
39
41
|
end
|
@@ -41,12 +43,23 @@ module Mongoid #:nodoc:
|
|
41
43
|
# Used for setting an object in the attributes hash. If nil is provided the
|
42
44
|
# default will get returned if it exists.
|
43
45
|
def set(object)
|
44
|
-
|
46
|
+
type.set(object)
|
45
47
|
end
|
46
48
|
|
47
49
|
# Used for retrieving the object out of the attributes hash.
|
48
50
|
def get(object)
|
49
51
|
type.get(object)
|
50
52
|
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
# Slightly faster default check.
|
56
|
+
def copy
|
57
|
+
@copyable ? @default.dup : @default
|
58
|
+
end
|
59
|
+
|
60
|
+
# Check if the name is valid.
|
61
|
+
def check_name!(name)
|
62
|
+
raise Errors::InvalidField.new(name) if Mongoid.destructive_fields.include?(name.to_s)
|
63
|
+
end
|
51
64
|
end
|
52
65
|
end
|
data/lib/mongoid/fields.rb
CHANGED
@@ -44,6 +44,7 @@ module Mongoid #:nodoc
|
|
44
44
|
meth = options.delete(:as) || name
|
45
45
|
fields[name] = Field.new(name, options)
|
46
46
|
create_accessors(name, meth, options)
|
47
|
+
add_dirty_methods(name)
|
47
48
|
end
|
48
49
|
|
49
50
|
# Create the field accessors.
|
@@ -55,7 +56,6 @@ module Mongoid #:nodoc
|
|
55
56
|
(options[:type] == Boolean) ? attr == true : attr.present?
|
56
57
|
end
|
57
58
|
end
|
58
|
-
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|