mongoid 2.3.5 → 2.4.0

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.
Files changed (126) hide show
  1. data/CHANGELOG.md +34 -176
  2. data/LICENSE +1 -1
  3. data/lib/config/locales/bg.yml +6 -0
  4. data/lib/config/locales/de.yml +6 -0
  5. data/lib/config/locales/en-GB.yml +8 -0
  6. data/lib/config/locales/en.yml +8 -0
  7. data/lib/config/locales/es.yml +9 -3
  8. data/lib/config/locales/fr.yml +6 -0
  9. data/lib/config/locales/hi.yml +6 -0
  10. data/lib/config/locales/hu.yml +6 -0
  11. data/lib/config/locales/id.yml +6 -0
  12. data/lib/config/locales/it.yml +6 -0
  13. data/lib/config/locales/ja.yml +6 -0
  14. data/lib/config/locales/kr.yml +6 -0
  15. data/lib/config/locales/nl.yml +8 -0
  16. data/lib/config/locales/pl.yml +6 -0
  17. data/lib/config/locales/pt-BR.yml +6 -0
  18. data/lib/config/locales/pt.yml +8 -2
  19. data/lib/config/locales/ro.yml +6 -0
  20. data/lib/config/locales/ru.yml +6 -0
  21. data/lib/config/locales/sv.yml +6 -0
  22. data/lib/config/locales/vi.yml +14 -8
  23. data/lib/config/locales/zh-CN.yml +6 -0
  24. data/lib/mongoid/atomic.rb +62 -13
  25. data/lib/mongoid/atomic/modifiers.rb +33 -1
  26. data/lib/mongoid/attributes.rb +5 -19
  27. data/lib/mongoid/callbacks.rb +2 -1
  28. data/lib/mongoid/collection.rb +2 -2
  29. data/lib/mongoid/collections/retry.rb +18 -6
  30. data/lib/mongoid/components.rb +2 -0
  31. data/lib/mongoid/config.rb +8 -63
  32. data/lib/mongoid/config/environment.rb +41 -0
  33. data/lib/mongoid/config/options.rb +74 -0
  34. data/lib/mongoid/contexts/enumerable.rb +0 -24
  35. data/lib/mongoid/contexts/mongo.rb +33 -3
  36. data/lib/mongoid/copyable.rb +1 -1
  37. data/lib/mongoid/criteria.rb +4 -2
  38. data/lib/mongoid/criterion/inclusion.rb +1 -16
  39. data/lib/mongoid/criterion/optional.rb +37 -10
  40. data/lib/mongoid/criterion/scoping.rb +83 -0
  41. data/lib/mongoid/criterion/selector.rb +9 -6
  42. data/lib/mongoid/default_scope.rb +1 -1
  43. data/lib/mongoid/dirty.rb +163 -29
  44. data/lib/mongoid/document.rb +58 -7
  45. data/lib/mongoid/errors.rb +2 -0
  46. data/lib/mongoid/errors/no_environment.rb +19 -0
  47. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  48. data/lib/mongoid/extensions.rb +6 -0
  49. data/lib/mongoid/extensions/array/deep_copy.rb +25 -0
  50. data/lib/mongoid/extensions/hash/deep_copy.rb +25 -0
  51. data/lib/mongoid/extensions/hash/scoping.rb +1 -1
  52. data/lib/mongoid/extensions/object/deep_copy.rb +21 -0
  53. data/lib/mongoid/extensions/proc/scoping.rb +2 -2
  54. data/lib/mongoid/extensions/symbol/inflections.rb +1 -0
  55. data/lib/mongoid/fields.rb +171 -104
  56. data/lib/mongoid/fields/{serializable → internal}/array.rb +33 -1
  57. data/lib/mongoid/fields/{serializable → internal}/big_decimal.rb +16 -1
  58. data/lib/mongoid/fields/{serializable → internal}/bignum.rb +1 -1
  59. data/lib/mongoid/fields/{serializable → internal}/binary.rb +1 -1
  60. data/lib/mongoid/fields/{serializable → internal}/boolean.rb +16 -1
  61. data/lib/mongoid/fields/{serializable → internal}/date.rb +1 -1
  62. data/lib/mongoid/fields/{serializable → internal}/date_time.rb +1 -1
  63. data/lib/mongoid/fields/{serializable → internal}/fixnum.rb +1 -1
  64. data/lib/mongoid/fields/{serializable → internal}/float.rb +16 -1
  65. data/lib/mongoid/fields/internal/foreign_keys/array.rb +74 -0
  66. data/lib/mongoid/fields/{serializable → internal}/foreign_keys/object.rb +11 -2
  67. data/lib/mongoid/fields/{serializable → internal}/hash.rb +1 -1
  68. data/lib/mongoid/fields/{serializable → internal}/integer.rb +16 -1
  69. data/lib/mongoid/fields/{serializable → internal}/localized.rb +23 -2
  70. data/lib/mongoid/fields/{serializable → internal}/nil_class.rb +16 -1
  71. data/lib/mongoid/fields/{serializable → internal}/object.rb +1 -1
  72. data/lib/mongoid/fields/{serializable → internal}/object_id.rb +16 -1
  73. data/lib/mongoid/fields/{serializable → internal}/range.rb +21 -2
  74. data/lib/mongoid/fields/{serializable → internal}/set.rb +16 -1
  75. data/lib/mongoid/fields/{serializable → internal}/string.rb +16 -1
  76. data/lib/mongoid/fields/{serializable → internal}/symbol.rb +17 -1
  77. data/lib/mongoid/fields/{serializable → internal}/time.rb +1 -1
  78. data/lib/mongoid/fields/{serializable → internal}/time_with_zone.rb +1 -1
  79. data/lib/mongoid/fields/{serializable → internal}/timekeeping.rb +16 -1
  80. data/lib/mongoid/fields/mappings.rb +8 -3
  81. data/lib/mongoid/fields/serializable.rb +34 -3
  82. data/lib/mongoid/hierarchy.rb +14 -14
  83. data/lib/mongoid/identity_map.rb +3 -2
  84. data/lib/mongoid/logger.rb +1 -7
  85. data/lib/mongoid/named_scope.rb +16 -12
  86. data/lib/mongoid/observer.rb +5 -1
  87. data/lib/mongoid/paranoia.rb +1 -0
  88. data/lib/mongoid/persistence.rb +11 -4
  89. data/lib/mongoid/persistence/atomic.rb +4 -1
  90. data/lib/mongoid/persistence/atomic/add_to_set.rb +17 -1
  91. data/lib/mongoid/persistence/atomic/sets.rb +1 -1
  92. data/lib/mongoid/railties/database.rake +1 -1
  93. data/lib/mongoid/relations.rb +1 -3
  94. data/lib/mongoid/relations/auto_save.rb +1 -1
  95. data/lib/mongoid/relations/builders.rb +1 -1
  96. data/lib/mongoid/relations/builders/embedded/many.rb +2 -6
  97. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  98. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  99. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -1
  100. data/lib/mongoid/relations/cascading/delete.rb +1 -1
  101. data/lib/mongoid/relations/cyclic.rb +10 -6
  102. data/lib/mongoid/relations/embedded/atomic.rb +3 -3
  103. data/lib/mongoid/relations/embedded/many.rb +98 -20
  104. data/lib/mongoid/relations/macros.rb +2 -0
  105. data/lib/mongoid/relations/many.rb +13 -0
  106. data/lib/mongoid/relations/metadata.rb +3 -3
  107. data/lib/mongoid/relations/nested_builder.rb +4 -3
  108. data/lib/mongoid/relations/proxy.rb +0 -1
  109. data/lib/mongoid/relations/referenced/batch.rb +3 -2
  110. data/lib/mongoid/relations/referenced/in.rb +3 -3
  111. data/lib/mongoid/relations/referenced/many.rb +89 -10
  112. data/lib/mongoid/relations/referenced/many_to_many.rb +34 -43
  113. data/lib/mongoid/relations/referenced/one.rb +8 -4
  114. data/lib/mongoid/relations/synchronization.rb +22 -5
  115. data/lib/mongoid/threaded.rb +38 -276
  116. data/lib/mongoid/threaded/lifecycle.rb +18 -18
  117. data/lib/mongoid/timestamps/updated.rb +13 -3
  118. data/lib/mongoid/validations.rb +22 -1
  119. data/lib/mongoid/validations/presence.rb +40 -0
  120. data/lib/mongoid/validations/uniqueness.rb +14 -3
  121. data/lib/mongoid/version.rb +1 -1
  122. data/lib/mongoid/versioning.rb +6 -2
  123. data/lib/rails/mongoid.rb +7 -1
  124. metadata +64 -45
  125. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +0 -42
  126. data/lib/mongoid/relations/embedded/sort.rb +0 -31
@@ -6,7 +6,7 @@ module Mongoid #:nodoc:
6
6
  # mongoid criteria selectors.
7
7
  class Selector < Hash
8
8
 
9
- attr_reader :fields, :klass
9
+ attr_reader :aliased_fields, :fields, :klass
10
10
 
11
11
  # Create the new selector.
12
12
  #
@@ -17,7 +17,8 @@ module Mongoid #:nodoc:
17
17
  #
18
18
  # @since 1.0.0
19
19
  def initialize(klass)
20
- @fields, @klass = klass.fields.except("_id", "_type"), klass
20
+ @aliased_fields, @fields, @klass =
21
+ klass.aliased_fields, klass.fields.except("_id", "_type"), klass
21
22
  end
22
23
 
23
24
  # Set the value for the supplied key, attempting to typecast the value.
@@ -84,8 +85,10 @@ module Mongoid #:nodoc:
84
85
  # @since 1.0.0
85
86
  def try_to_typecast(key, value)
86
87
  access = key.to_s
87
- return value unless fields.has_key?(access)
88
- field = fields[access]
88
+ if !fields.has_key?(access) && !aliased_fields.has_key?(access)
89
+ return value
90
+ end
91
+ field = fields[access] || fields[aliased_fields[access]]
89
92
  typecast_value_for(field, value)
90
93
  end
91
94
 
@@ -101,7 +104,7 @@ module Mongoid #:nodoc:
101
104
  #
102
105
  # @since 1.0.0
103
106
  def typecast_value_for(field, value)
104
- return field.serialize(value) if field.type === value
107
+ return field.selection(value) if field.type === value
105
108
  case value
106
109
  when Hash
107
110
  value = value.dup
@@ -121,7 +124,7 @@ module Mongoid #:nodoc:
121
124
  if field.type == Array
122
125
  Serialization.mongoize(value, value.class)
123
126
  else
124
- field.serialize(value)
127
+ field.selection(value)
125
128
  end
126
129
  end
127
130
  end
@@ -29,7 +29,7 @@ module Mongoid #:nodoc:
29
29
  #
30
30
  # @since 2.0.0.rc.1
31
31
  def default_scope(conditions = {})
32
- self.default_scoping = Scope.new(conditions).conditions.scoped
32
+ self.default_scoping = Scope.new(conditions).conditions.as_conditions
33
33
  end
34
34
  end
35
35
  end
@@ -2,7 +2,58 @@
2
2
  module Mongoid #:nodoc:
3
3
  module Dirty #:nodoc:
4
4
  extend ActiveSupport::Concern
5
- include ActiveModel::Dirty
5
+
6
+ # Get the changed attributes for the document.
7
+ #
8
+ # @example Get the changed attributes.
9
+ # model.changed
10
+ #
11
+ # @return [ Array<String> ] The changed attributes.
12
+ #
13
+ # @since 2.4.0
14
+ def changed
15
+ changed_attributes.keys
16
+ end
17
+
18
+ # Has the document changed?
19
+ #
20
+ # @example Has the document changed?
21
+ # model.changed?
22
+ #
23
+ # @return [ true, false ] If the document is changed.
24
+ #
25
+ # @since 2.4.0
26
+ def changed?
27
+ changed_attributes.any?
28
+ end
29
+
30
+ # Get the attribute changes.
31
+ #
32
+ # @example Get the attribute changes.
33
+ # model.changed_attributes
34
+ #
35
+ # @return [ Hash<String, Object> ] The attribute changes.
36
+ #
37
+ # @since 2.4.0
38
+ def changed_attributes
39
+ @changed_attributes ||= {}
40
+ end
41
+
42
+ # Get all the changes for the document.
43
+ #
44
+ # @example Get all the changes.
45
+ # model.changes
46
+ #
47
+ # @return [ Hash<String, Array<Object, Object> ] The changes.
48
+ #
49
+ # @since 2.4.0
50
+ def changes
51
+ changed.inject({}.with_indifferent_access) do |changes, attr|
52
+ changes.tap do |hash|
53
+ hash[attr] = attribute_change(attr)
54
+ end
55
+ end
56
+ end
6
57
 
7
58
  # Call this method after save, so the changes can be properly switched.
8
59
  #
@@ -15,14 +66,25 @@ module Mongoid #:nodoc:
15
66
  # @since 2.1.0
16
67
  def move_changes
17
68
  @_children = nil
18
- @previously_changed = changes
19
- atomic_pulls.clear
20
- atomic_unsets.clear
21
- delayed_atomic_sets.clear
22
- delayed_atomic_pulls.clear
69
+ @previous_changes = changes
70
+ Atomic::UPDATES.each do |update|
71
+ send(update).clear
72
+ end
23
73
  changed_attributes.clear
24
74
  end
25
75
 
76
+ # Get the previous changes on the document.
77
+ #
78
+ # @example Get the previous changes.
79
+ # model.previous_changes
80
+ #
81
+ # @return [ Hash<String, Array<Object, Object> ] The previous changes.
82
+ #
83
+ # @since 2.4.0
84
+ def previous_changes
85
+ @previous_changes
86
+ end
87
+
26
88
  # Remove a change from the dirty attributes hash. Used by the single field
27
89
  # atomic updators.
28
90
  #
@@ -39,6 +101,8 @@ module Mongoid #:nodoc:
39
101
  # Gets all the new values for each of the changed fields, to be passed to
40
102
  # a MongoDB $set modifier.
41
103
  #
104
+ # @todo: Durran: Refactor 3.0
105
+ #
42
106
  # @example Get the setters for the atomic updates.
43
107
  # person = Person.new(:title => "Sir")
44
108
  # person.title = "Madam"
@@ -47,10 +111,17 @@ module Mongoid #:nodoc:
47
111
  # @return [ Hash ] A +Hash+ of atomic setters.
48
112
  def setters
49
113
  {}.tap do |modifications|
50
- changes.each_pair do |field, changes|
114
+ changes.each_pair do |name, changes|
51
115
  if changes
52
- key = embedded? ? "#{atomic_position}.#{field}" : field
53
- modifications[key] = changes[1]
116
+ old, new = changes
117
+ field = fields[name]
118
+ key = embedded? ? "#{atomic_position}.#{name}" : name
119
+ if field && field.resizable?
120
+ pushes, pulls = new - (old || []), (old || []) - new
121
+ field.add_atomic_changes(self, key, modifications, pushes, pulls)
122
+ else
123
+ modifications[key] = new
124
+ end
54
125
  end
55
126
  end
56
127
  end
@@ -58,15 +129,14 @@ module Mongoid #:nodoc:
58
129
 
59
130
  private
60
131
 
61
- # Get the current value for the specified attribute, if the attribute has changed.
132
+ # Get the old and new value for the provided attribute.
62
133
  #
63
- # @note This is overriding the AM::Dirty implementation to read from the mongoid
64
- # attributes hash, which may contain a serialized version of the attributes data. It is
65
- # necessary to read the serialized version as the changed value, to allow updates to
66
- # the MongoDB document to persist correctly. For example, if a DateTime field is updated
67
- # it must be persisted as a UTC Time.
134
+ # @example Get the attribute change.
135
+ # model.attribute_change("name")
136
+ #
137
+ # @param [ String ] attr The name of the attribute.
68
138
  #
69
- # @return [ Object ] The current value of the field, or nil if no change made.
139
+ # @return [ Array<Object> ] The old and new values.
70
140
  #
71
141
  # @since 2.1.0
72
142
  def attribute_change(attr)
@@ -75,8 +145,8 @@ module Mongoid #:nodoc:
75
145
 
76
146
  # Determine if a specific attribute has changed.
77
147
  #
78
- # @note Overriding AM::Dirty once again since their implementation is not
79
- # friendly to fields that can be changed in place.
148
+ # @example Has the attribute changed?
149
+ # model.attribute_changed?("name")
80
150
  #
81
151
  # @param [ String ] attr The name of the attribute.
82
152
  #
@@ -84,26 +154,90 @@ module Mongoid #:nodoc:
84
154
  #
85
155
  # @since 2.1.6
86
156
  def attribute_changed?(attr)
87
- return false unless changed_attributes.include?(attr)
157
+ return false unless changed_attributes.has_key?(attr)
88
158
  changed_attributes[attr] != attributes[attr]
89
159
  end
90
160
 
91
- # Override Active Model's behaviour here in order to stay away from
92
- # infinite loops on getter/setter overrides.
161
+ # Get the previous value for the attribute.
162
+ #
163
+ # @example Get the previous value.
164
+ # model.attribute_was("name")
165
+ #
166
+ # @param [ String ] attr The attribute name.
167
+ #
168
+ # @since 2.4.0
169
+ def attribute_was(attr)
170
+ attribute_changed?(attr) ? changed_attributes[attr] : attributes[attr]
171
+ end
172
+
173
+ # Flag an attribute as going to change.
93
174
  #
94
- # @example Flag an attribute as changing.
95
- # document.attribute_will_change!(:name)
175
+ # @example Flag the attribute.
176
+ # model.attribute_will_change!("name")
96
177
  #
97
- # @param [ Symbol ] attr The attribute.
178
+ # @param [ String ] attr The name of the attribute.
98
179
  #
99
- # @return [ Object ] The value of the attribute.
180
+ # @return [ Object ] The old value.
100
181
  #
101
182
  # @since 2.3.0
102
183
  def attribute_will_change!(attr)
103
- unless changed_attributes.include?(attr)
104
- value = read_attribute(attr)
105
- value = value.duplicable? ? value.clone : value
106
- changed_attributes[attr] = value
184
+ unless changed_attributes.has_key?(attr)
185
+ changed_attributes[attr] = read_attribute(attr)._deep_copy
186
+ end
187
+ end
188
+
189
+ # Set the attribute back to it's old value.
190
+ #
191
+ # @example Reset the attribute.
192
+ # model.reset_attribute!("name")
193
+ #
194
+ # @param [ String ] attr The name of the attribute.
195
+ #
196
+ # @return [ Object ] The old value.
197
+ #
198
+ # @since 2.4.0
199
+ def reset_attribute!(attr)
200
+ attributes[attr] = changed_attributes[attr] if attribute_changed?(attr)
201
+ end
202
+
203
+ module ClassMethods #:nodoc:
204
+
205
+ private
206
+
207
+ # Generate all the dirty methods needed for the attribute.
208
+ #
209
+ # @example Generate the dirty methods.
210
+ # Model.create_dirty_methods("name")
211
+ #
212
+ # @param [ String ] name The name of the attribute.
213
+ #
214
+ # @return [ Module ] The fields module.
215
+ #
216
+ # @since 2.4.0
217
+ def create_dirty_methods(name)
218
+ generated_methods.module_eval do
219
+ class_eval <<-EOM
220
+ def #{name}_change
221
+ attribute_change(#{name.inspect})
222
+ end
223
+
224
+ def #{name}_changed?
225
+ attribute_changed?(#{name.inspect})
226
+ end
227
+
228
+ def #{name}_was
229
+ attribute_was(#{name.inspect})
230
+ end
231
+
232
+ def #{name}_will_change!
233
+ attribute_will_change!(#{name.inspect})
234
+ end
235
+
236
+ def reset_#{name}!
237
+ reset_attribute!(#{name.inspect})
238
+ end
239
+ EOM
240
+ end
107
241
  end
108
242
  end
109
243
  end
@@ -68,8 +68,7 @@ module Mongoid #:nodoc:
68
68
  #
69
69
  # @since 2.0.0
70
70
  def freeze
71
- attributes.freeze
72
- self
71
+ tap { |doc| doc.as_document.freeze }
73
72
  end
74
73
 
75
74
  # Checks if the document is frozen
@@ -81,7 +80,7 @@ module Mongoid #:nodoc:
81
80
  #
82
81
  # @since 2.0.0
83
82
  def frozen?
84
- raw_attributes.frozen?
83
+ attributes.frozen?
85
84
  end
86
85
 
87
86
  # Delegates to id in order to allow two records of the same type and id to
@@ -95,7 +94,7 @@ module Mongoid #:nodoc:
95
94
  #
96
95
  # @return [ Integer ] The hash of the document's id.
97
96
  def hash
98
- raw_attributes["_id"].hash
97
+ attributes["_id"].hash
99
98
  end
100
99
 
101
100
  # Generate an id for this +Document+.
@@ -128,15 +127,33 @@ module Mongoid #:nodoc:
128
127
  @new_record = true
129
128
  @attributes ||= {}
130
129
  options ||= {}
130
+ apply_non_proc_defaults
131
+ identify if using_object_ids?
131
132
  process(attrs, options[:as] || :default, !options[:without_protection]) do
132
- identify
133
- apply_defaults
133
+ identify unless using_object_ids?
134
134
  yield(self) if block_given?
135
135
  end
136
+ apply_proc_defaults
136
137
  run_callbacks(:initialize) { self }
137
138
  end
138
139
  end
139
140
 
141
+ # Return the key value for the document.
142
+ #
143
+ # @example Return the key.
144
+ # document.to_key
145
+ #
146
+ # @return [ Object ] The id of the document or nil if new.
147
+ #
148
+ # @since 2.4.0
149
+ def to_key
150
+ if destroyed?
151
+ [ id ]
152
+ else
153
+ persisted? ? [ id ] : nil
154
+ end
155
+ end
156
+
140
157
  # Return an array with this +Document+ only in it.
141
158
  #
142
159
  # @example Return the document in an array.
@@ -157,6 +174,7 @@ module Mongoid #:nodoc:
157
174
  # @return [ Hash ] A hash of all attributes in the hierarchy.
158
175
  def as_document
159
176
  attributes.tap do |attrs|
177
+ return attrs if frozen?
160
178
  relations.each_pair do |name, meta|
161
179
  if meta.embedded?
162
180
  relation = send(name)
@@ -189,6 +207,27 @@ module Mongoid #:nodoc:
189
207
  end
190
208
  end
191
209
 
210
+ # Print out the cache key. This will append different values on the
211
+ # plural model name.
212
+ #
213
+ # If new_record? - will append /new
214
+ # If not - will append /id-updated_at.to_s(:number)
215
+ # Without updated_at - will append /id
216
+ #
217
+ # This is usually called insode a cache() block
218
+ #
219
+ # @example Returns the cache key
220
+ # document.cache_key
221
+ #
222
+ # @return [ String ] the string with or without updated_at
223
+ #
224
+ # @since 2.4.0
225
+ def cache_key
226
+ return "#{model_key}/new" if new_record?
227
+ return "#{model_key}/#{id}-#{updated_at.utc.to_s(:number)}" if updated_at
228
+ "#{model_key}/#{id}"
229
+ end
230
+
192
231
  private
193
232
 
194
233
  # Returns the logger
@@ -200,6 +239,18 @@ module Mongoid #:nodoc:
200
239
  Mongoid.logger
201
240
  end
202
241
 
242
+ # Get the name of the model used in caching.
243
+ #
244
+ # @example Get the model key.
245
+ # model.model_key
246
+ #
247
+ # @return [ String ] The model key.
248
+ #
249
+ # @since 2.4.0
250
+ def model_key
251
+ @model_cache_key ||= "#{self.class.model_name.cache_key}"
252
+ end
253
+
203
254
  # Implement this for calls to flatten on array.
204
255
  #
205
256
  # @example Get the document as an array.
@@ -241,7 +292,7 @@ module Mongoid #:nodoc:
241
292
  attributes = attrs || {}
242
293
  allocate.tap do |doc|
243
294
  doc.instance_variable_set(:@attributes, attributes)
244
- doc.send(:apply_defaults)
295
+ doc.apply_defaults
245
296
  IdentityMap.set(doc) unless _loading_revision?
246
297
  doc.run_callbacks(:initialize) { doc }
247
298
  end
@@ -11,6 +11,8 @@ require "mongoid/errors/invalid_options"
11
11
  require "mongoid/errors/invalid_time"
12
12
  require "mongoid/errors/invalid_type"
13
13
  require "mongoid/errors/mixed_relations"
14
+ require "mongoid/errors/no_environment"
15
+ require "mongoid/errors/scope_overwrite"
14
16
  require "mongoid/errors/too_many_nested_attribute_records"
15
17
  require "mongoid/errors/unsaved_document"
16
18
  require "mongoid/errors/unsupported_version"
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ module Errors #:nodoc
4
+
5
+ # Raised when trying to load configuration with no RACK_ENV set
6
+ class NoEnvironment < MongoidError
7
+
8
+ # Create the new no environment error.
9
+ #
10
+ # @example Create the new no environment error.
11
+ # NoEnvironment.new
12
+ #
13
+ # @since 2.4.0
14
+ def initialize
15
+ super(translate("no_environment", {}))
16
+ end
17
+ end
18
+ end
19
+ end