mongoid 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +4 -4
- data/lib/config/locales/{pt-br.yml → pt-BR.yml} +5 -5
- data/lib/config/locales/ru.yml +1 -1
- data/lib/config/locales/zh-CN.yml +2 -0
- data/lib/mongoid.rb +0 -1
- data/lib/mongoid/attributes.rb +9 -6
- data/lib/mongoid/collection.rb +21 -0
- data/lib/mongoid/config.rb +31 -8
- data/lib/mongoid/config/replset_database.rb +32 -2
- data/lib/mongoid/contexts.rb +0 -1
- data/lib/mongoid/contexts/enumerable.rb +73 -36
- data/lib/mongoid/contexts/mongo.rb +5 -12
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +4 -23
- data/lib/mongoid/criterion/exclusion.rb +15 -0
- data/lib/mongoid/criterion/inclusion.rb +1 -1
- data/lib/mongoid/criterion/optional.rb +0 -1
- data/lib/mongoid/criterion/unconvertable.rb +20 -0
- data/lib/mongoid/cursor.rb +3 -3
- data/lib/mongoid/dirty.rb +8 -8
- data/lib/mongoid/document.rb +33 -36
- data/lib/mongoid/extensions.rb +7 -0
- data/lib/mongoid/extensions/object/checks.rb +32 -0
- data/lib/mongoid/extensions/object/conversions.rb +1 -1
- data/lib/mongoid/extensions/object_id/conversions.rb +6 -1
- data/lib/mongoid/extensions/range/conversions.rb +25 -0
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/field.rb +50 -0
- data/lib/mongoid/fields.rb +42 -7
- data/lib/mongoid/finders.rb +5 -17
- data/lib/mongoid/identity.rb +1 -1
- data/lib/mongoid/inspection.rb +17 -21
- data/lib/mongoid/matchers.rb +6 -2
- data/lib/mongoid/matchers/strategies.rb +2 -2
- data/lib/mongoid/named_scope.rb +1 -1
- data/lib/mongoid/observer.rb +45 -14
- data/lib/mongoid/paranoia.rb +2 -2
- data/lib/mongoid/persistence.rb +2 -2
- data/lib/mongoid/persistence/update.rb +2 -1
- data/lib/mongoid/railtie.rb +3 -5
- data/lib/mongoid/relations.rb +1 -0
- data/lib/mongoid/relations/builders.rb +3 -3
- data/lib/mongoid/relations/builders/embedded/in.rb +1 -1
- data/lib/mongoid/relations/builders/embedded/many.rb +1 -1
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/in.rb +0 -3
- data/lib/mongoid/relations/builders/referenced/many.rb +21 -1
- data/lib/mongoid/relations/builders/referenced/one.rb +0 -4
- data/lib/mongoid/relations/embedded/many.rb +1 -17
- data/lib/mongoid/relations/macros.rb +3 -2
- data/lib/mongoid/relations/many.rb +2 -0
- data/lib/mongoid/relations/proxy.rb +1 -1
- data/lib/mongoid/relations/referenced/batch.rb +71 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/many.rb +61 -2
- data/lib/mongoid/serialization.rb +1 -1
- data/lib/mongoid/validations/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +8 -11
- metadata +22 -64
- data/lib/mongoid/contexts/paging.rb +0 -50
@@ -2,7 +2,6 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Contexts #:nodoc:
|
4
4
|
class Mongo
|
5
|
-
include Paging
|
6
5
|
attr_accessor :criteria
|
7
6
|
|
8
7
|
delegate :klass, :options, :field_list, :selector, :to => :criteria
|
@@ -122,14 +121,8 @@ module Mongoid #:nodoc:
|
|
122
121
|
# Returns:
|
123
122
|
#
|
124
123
|
# An enumerable +Cursor+.
|
125
|
-
def execute
|
126
|
-
|
127
|
-
if cursor
|
128
|
-
@count = cursor.count if paginating
|
129
|
-
cursor
|
130
|
-
else
|
131
|
-
[]
|
132
|
-
end
|
124
|
+
def execute
|
125
|
+
klass.collection.find(selector, process_options) || []
|
133
126
|
end
|
134
127
|
|
135
128
|
# Groups the context. This will take the internally built selector and options
|
@@ -152,7 +145,7 @@ module Mongoid #:nodoc:
|
|
152
145
|
:reduce => Javascript.group
|
153
146
|
).collect do |docs|
|
154
147
|
docs["group"] = docs["group"].collect do |attrs|
|
155
|
-
Mongoid::Factory.
|
148
|
+
Mongoid::Factory.from_db(klass, attrs)
|
156
149
|
end
|
157
150
|
docs
|
158
151
|
end
|
@@ -203,7 +196,7 @@ module Mongoid #:nodoc:
|
|
203
196
|
sorting = [[:_id, :asc]] unless sorting
|
204
197
|
opts[:sort] = sorting.collect { |option| [ option[0], option[1].invert ] }
|
205
198
|
attributes = klass.collection.find_one(selector, opts)
|
206
|
-
attributes ? Mongoid::Factory.
|
199
|
+
attributes ? Mongoid::Factory.from_db(klass, attributes) : nil
|
207
200
|
end
|
208
201
|
|
209
202
|
# Return the max value for a field.
|
@@ -253,7 +246,7 @@ module Mongoid #:nodoc:
|
|
253
246
|
# The first document in the collection.
|
254
247
|
def one
|
255
248
|
attributes = klass.collection.find_one(selector, process_options)
|
256
|
-
attributes ? Mongoid::Factory.
|
249
|
+
attributes ? Mongoid::Factory.from_db(klass, attributes) : nil
|
257
250
|
end
|
258
251
|
|
259
252
|
alias :first :one
|
data/lib/mongoid/copyable.rb
CHANGED
@@ -37,8 +37,8 @@ module Mongoid #:nodoc:
|
|
37
37
|
value = other.instance_variable_get(name)
|
38
38
|
instance_variable_set(name, value ? value.dup : nil)
|
39
39
|
end
|
40
|
-
|
41
|
-
|
40
|
+
attributes.delete("_id")
|
41
|
+
attributes.delete("versions")
|
42
42
|
@new_record = true
|
43
43
|
identify
|
44
44
|
end
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -7,6 +7,7 @@ require "mongoid/criterion/inclusion"
|
|
7
7
|
require "mongoid/criterion/inspection"
|
8
8
|
require "mongoid/criterion/optional"
|
9
9
|
require "mongoid/criterion/selector"
|
10
|
+
require "mongoid/criterion/unconvertable"
|
10
11
|
|
11
12
|
module Mongoid #:nodoc:
|
12
13
|
|
@@ -61,9 +62,6 @@ module Mongoid #:nodoc:
|
|
61
62
|
:max,
|
62
63
|
:min,
|
63
64
|
:one,
|
64
|
-
:page,
|
65
|
-
:paginate,
|
66
|
-
:per_page,
|
67
65
|
:shift,
|
68
66
|
:sum,
|
69
67
|
:update,
|
@@ -202,12 +200,13 @@ module Mongoid #:nodoc:
|
|
202
200
|
#
|
203
201
|
# name: The name of the class method on the +Document+ to chain.
|
204
202
|
# args: The arguments passed to the method.
|
203
|
+
# block: Optional block to pass
|
205
204
|
#
|
206
205
|
# Returns: <tt>Criteria</tt>
|
207
|
-
def method_missing(name, *args)
|
206
|
+
def method_missing(name, *args, &block)
|
208
207
|
if @klass.respond_to?(name)
|
209
208
|
@klass.send(:with_scope, self) do
|
210
|
-
@klass.send(name, *args)
|
209
|
+
@klass.send(name, *args, &block)
|
211
210
|
end
|
212
211
|
else
|
213
212
|
return entries.send(name, *args)
|
@@ -308,24 +307,6 @@ module Mongoid #:nodoc:
|
|
308
307
|
other.is_a?(Criteria) ? other.entries : other
|
309
308
|
end
|
310
309
|
|
311
|
-
# Filters the unused options out of the options +Hash+. Currently this
|
312
|
-
# takes into account the "page" and "per_page" options that would be passed
|
313
|
-
# in if using will_paginate.
|
314
|
-
#
|
315
|
-
# Example:
|
316
|
-
#
|
317
|
-
# Given a criteria with a selector of { :page => 1, :per_page => 40 }
|
318
|
-
#
|
319
|
-
# <tt>criteria.filter_options</tt> # selector: { :skip => 0, :limit => 40 }
|
320
|
-
def filter_options
|
321
|
-
page_num = @options.delete(:page)
|
322
|
-
per_page_num = @options.delete(:per_page)
|
323
|
-
if (page_num || per_page_num)
|
324
|
-
@options[:limit] = limits = (per_page_num || 20).to_i
|
325
|
-
@options[:skip] = (page_num || 1).to_i * limits - limits
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
310
|
# Clone or dup the current +Criteria+. This will return a new criteria with
|
330
311
|
# the selector, options, klass, embedded options, etc intact.
|
331
312
|
#
|
@@ -24,6 +24,21 @@ module Mongoid #:nodoc:
|
|
24
24
|
update_selector(attributes, "$ne")
|
25
25
|
end
|
26
26
|
|
27
|
+
# Used when wanting to set the fields options directly using a hash
|
28
|
+
# instead of going through only or without.
|
29
|
+
#
|
30
|
+
# @example Set the limited fields.
|
31
|
+
# criteria.fields(:field => 1)
|
32
|
+
#
|
33
|
+
# @param [ Hash ] attributes The field options.
|
34
|
+
#
|
35
|
+
# @return [ Criteria ] A newly cloned copy.
|
36
|
+
#
|
37
|
+
# @since 2.0.2
|
38
|
+
def fields(attributes = nil)
|
39
|
+
clone.tap { |crit| crit.options[:fields] = attributes || {} }
|
40
|
+
end
|
41
|
+
|
27
42
|
# Adds a criterion to the +Criteria+ that specifies values where none
|
28
43
|
# should match in order to return results. This is similar to an SQL
|
29
44
|
# "NOT IN" clause. The MongoDB conditional operator that will be
|
@@ -189,7 +189,7 @@ module Mongoid #:nodoc:
|
|
189
189
|
def execute_or_raise(args, criteria)
|
190
190
|
(args[0].is_a?(Array) ? criteria.entries : criteria.one).tap do |result|
|
191
191
|
if Mongoid.raise_not_found_error && !args.flatten.blank?
|
192
|
-
raise Errors::DocumentNotFound.new(klass, args) if result.
|
192
|
+
raise Errors::DocumentNotFound.new(klass, args) if result._vacant?
|
193
193
|
end
|
194
194
|
end
|
195
195
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
|
5
|
+
# Wrapper class for strings that should not be converted into
|
6
|
+
# BSON::ObjectIds.
|
7
|
+
class Unconvertable < String
|
8
|
+
|
9
|
+
# Initialize just like a normal string, and quack like it to.
|
10
|
+
#
|
11
|
+
# @example Create the new Unconvertable.
|
12
|
+
# Unconvertable.new("testing")
|
13
|
+
#
|
14
|
+
# @param [ String ] value The string.
|
15
|
+
#
|
16
|
+
# @since 2.0.2
|
17
|
+
def initialize(value); super; end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/mongoid/cursor.rb
CHANGED
@@ -46,7 +46,7 @@ module Mongoid #:nodoc
|
|
46
46
|
# <tt>cursor.each { |doc| p doc.title }</tt>
|
47
47
|
def each
|
48
48
|
@cursor.each do |document|
|
49
|
-
yield Mongoid::Factory.
|
49
|
+
yield Mongoid::Factory.from_db(@klass, document)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -71,7 +71,7 @@ module Mongoid #:nodoc
|
|
71
71
|
#
|
72
72
|
# <tt>cursor.next_document</tt>
|
73
73
|
def next_document
|
74
|
-
Mongoid::Factory.
|
74
|
+
Mongoid::Factory.from_db(@klass, @cursor.next_document)
|
75
75
|
end
|
76
76
|
|
77
77
|
# Returns an array of all the documents in the cursor.
|
@@ -80,7 +80,7 @@ module Mongoid #:nodoc
|
|
80
80
|
#
|
81
81
|
# <tt>cursor.to_a</tt>
|
82
82
|
def to_a
|
83
|
-
@cursor.to_a.collect { |attrs| Mongoid::Factory.
|
83
|
+
@cursor.to_a.collect { |attrs| Mongoid::Factory.from_db(@klass, attrs) }
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
data/lib/mongoid/dirty.rb
CHANGED
@@ -46,7 +46,7 @@ module Mongoid #:nodoc:
|
|
46
46
|
# The old field value.
|
47
47
|
def attribute_was(name)
|
48
48
|
change = modifications[name]
|
49
|
-
change ? change[0] :
|
49
|
+
change ? change[0] : attributes[name]
|
50
50
|
end
|
51
51
|
|
52
52
|
# Gets the names of all the fields that have changed in the document.
|
@@ -157,7 +157,7 @@ module Mongoid #:nodoc:
|
|
157
157
|
# The old field value.
|
158
158
|
def reset_attribute!(name)
|
159
159
|
value = attribute_was(name)
|
160
|
-
value ?
|
160
|
+
value ? attributes[name] = value : attributes.delete(name)
|
161
161
|
modifications.delete(name)
|
162
162
|
end
|
163
163
|
|
@@ -210,7 +210,7 @@ module Mongoid #:nodoc:
|
|
210
210
|
def modifications
|
211
211
|
reset_modifications unless @modifications && @accessed
|
212
212
|
@accessed.each_pair do |field, value|
|
213
|
-
current =
|
213
|
+
current = attributes[field]
|
214
214
|
@modifications[field] = [ value, current ] if current != value
|
215
215
|
end
|
216
216
|
@accessed.clear
|
@@ -223,7 +223,7 @@ module Mongoid #:nodoc:
|
|
223
223
|
#
|
224
224
|
# <tt>person.modify("name", "Jack", "John")</tt>
|
225
225
|
def modify(name, old_value, new_value)
|
226
|
-
|
226
|
+
attributes[name] = new_value
|
227
227
|
if @modifications && (old_value != new_value)
|
228
228
|
original = @modifications[name].first if @modifications[name]
|
229
229
|
@modifications[name] = [ (original || old_value), new_value ]
|
@@ -243,10 +243,10 @@ module Mongoid #:nodoc:
|
|
243
243
|
# person.title_was # "Sir"
|
244
244
|
# person.reset_title!
|
245
245
|
def add_dirty_methods(name)
|
246
|
-
define_method("#{name}_change") { attribute_change(name) } unless instance_methods.include?("#{name}_change")
|
247
|
-
define_method("#{name}_changed?") { attribute_changed?(name) } unless instance_methods.include?("#{name}_changed?")
|
248
|
-
define_method("#{name}_was") { attribute_was(name) } unless instance_methods.include?("#{name}_was")
|
249
|
-
define_method("reset_#{name}!") { reset_attribute!(name) } unless instance_methods.include?("reset_#{name}!")
|
246
|
+
define_method("#{name}_change") { attribute_change(name) } unless instance_methods.include?("#{name}_change") || instance_methods.include?(:"#{name}_change")
|
247
|
+
define_method("#{name}_changed?") { attribute_changed?(name) } unless instance_methods.include?("#{name}_changed?") || instance_methods.include?(:"#{name}_changed?")
|
248
|
+
define_method("#{name}_was") { attribute_was(name) } unless instance_methods.include?("#{name}_was") || instance_methods.include?(:"#{name}_was")
|
249
|
+
define_method("reset_#{name}!") { reset_attribute!(name) } unless instance_methods.include?("reset_#{name}!") || instance_methods.include?(:"reset_#{name}!")
|
250
250
|
end
|
251
251
|
end
|
252
252
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
21
21
|
#
|
22
22
|
# @return [ Integer ] -1, 0, 1.
|
23
23
|
def <=>(other)
|
24
|
-
|
24
|
+
attributes["_id"].to_s <=> other.attributes["_id"].to_s
|
25
25
|
end
|
26
26
|
|
27
27
|
# Performs equality checking on the document ids. For more robust
|
@@ -35,7 +35,7 @@ module Mongoid #:nodoc:
|
|
35
35
|
# @return [ true, false ] True if the ids are equal, false if not.
|
36
36
|
def ==(other)
|
37
37
|
self.class == other.class &&
|
38
|
-
|
38
|
+
attributes["_id"] == other.attributes["_id"]
|
39
39
|
end
|
40
40
|
|
41
41
|
# Performs class equality checking.
|
@@ -71,7 +71,7 @@ module Mongoid #:nodoc:
|
|
71
71
|
#
|
72
72
|
# @since 2.0.0
|
73
73
|
def freeze
|
74
|
-
|
74
|
+
attributes.freeze
|
75
75
|
self
|
76
76
|
end
|
77
77
|
|
@@ -101,18 +101,6 @@ module Mongoid #:nodoc:
|
|
101
101
|
raw_attributes["_id"].hash
|
102
102
|
end
|
103
103
|
|
104
|
-
# Return the attributes hash with indifferent access. Used mostly for
|
105
|
-
# convenience - use +Document#raw_attributes+ where you dont care if the
|
106
|
-
# keys are all strings.
|
107
|
-
#
|
108
|
-
# @example Get the attributes.
|
109
|
-
# person.attributes
|
110
|
-
#
|
111
|
-
# @return [ HashWithIndifferentAccess ] The attributes.
|
112
|
-
def attributes
|
113
|
-
raw_attributes.with_indifferent_access
|
114
|
-
end
|
115
|
-
|
116
104
|
# Generate an id for this +Document+.
|
117
105
|
#
|
118
106
|
# @example Create the id.
|
@@ -146,16 +134,6 @@ module Mongoid #:nodoc:
|
|
146
134
|
run_callbacks(:initialize) { self }
|
147
135
|
end
|
148
136
|
|
149
|
-
# Return the attributes hash.
|
150
|
-
#
|
151
|
-
# @example Get the untouched attributes.
|
152
|
-
# person.raw_attributes
|
153
|
-
#
|
154
|
-
# @return [ Hash ] This document's attributes.
|
155
|
-
def raw_attributes
|
156
|
-
@attributes
|
157
|
-
end
|
158
|
-
|
159
137
|
# Reloads the +Document+ attributes from the database. If the document has
|
160
138
|
# not been saved then an error will get raised if the configuration option
|
161
139
|
# was set.
|
@@ -220,8 +198,8 @@ module Mongoid #:nodoc:
|
|
220
198
|
#
|
221
199
|
# @return [ Hash ] A hash of all attributes in the hierarchy.
|
222
200
|
def as_document
|
223
|
-
|
224
|
-
|
201
|
+
attribs = attributes
|
202
|
+
attribs.tap do |attrs|
|
225
203
|
relations.select { |name, meta| meta.embedded? }.each do |name, meta|
|
226
204
|
relation = send(name, false, :continue => false)
|
227
205
|
attrs[name] = relation.as_document unless relation.blank?
|
@@ -229,6 +207,29 @@ module Mongoid #:nodoc:
|
|
229
207
|
end
|
230
208
|
end
|
231
209
|
|
210
|
+
# Returns an instance of the specified class with the attributes
|
211
|
+
# and errors of the current document.
|
212
|
+
#
|
213
|
+
# @example Return a subclass document as a superclass instance.
|
214
|
+
# manager.becomes(Person)
|
215
|
+
#
|
216
|
+
# @raise [ ArgumentError ] If the class doesn't include Mongoid::Document
|
217
|
+
#
|
218
|
+
# @param [ Class ] klass The class to become.
|
219
|
+
#
|
220
|
+
# @return [ Document ] An instance of the specified class.
|
221
|
+
def becomes(klass)
|
222
|
+
unless klass.include?(Mongoid::Document)
|
223
|
+
raise ArgumentError, 'A class which includes Mongoid::Document is expected'
|
224
|
+
end
|
225
|
+
became = klass.new
|
226
|
+
became.instance_variable_set('@attributes', @attributes)
|
227
|
+
became.instance_variable_set('@errors', @errors)
|
228
|
+
became.instance_variable_set('@new_record', new_record?)
|
229
|
+
became.instance_variable_set('@destroyed', destroyed?)
|
230
|
+
became
|
231
|
+
end
|
232
|
+
|
232
233
|
module ClassMethods #:nodoc:
|
233
234
|
|
234
235
|
# Performs class equality checking.
|
@@ -256,15 +257,11 @@ module Mongoid #:nodoc:
|
|
256
257
|
# @return [ Document ] A new document.
|
257
258
|
def instantiate(attrs = nil)
|
258
259
|
attributes = attrs || {}
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
doc.run_callbacks(:initialize) { doc }
|
265
|
-
end
|
266
|
-
else
|
267
|
-
new(attrs)
|
260
|
+
allocate.tap do |doc|
|
261
|
+
doc.instance_variable_set(:@attributes, attributes)
|
262
|
+
doc.send(:apply_default_attributes)
|
263
|
+
doc.setup_modifications
|
264
|
+
doc.run_callbacks(:initialize) { doc }
|
268
265
|
end
|
269
266
|
end
|
270
267
|
|
data/lib/mongoid/extensions.rb
CHANGED
@@ -15,10 +15,12 @@ require "mongoid/extensions/hash/criteria_helpers"
|
|
15
15
|
require "mongoid/extensions/hash/scoping"
|
16
16
|
require "mongoid/extensions/integer/conversions"
|
17
17
|
require "mongoid/extensions/nil/collectionization"
|
18
|
+
require "mongoid/extensions/object/checks"
|
18
19
|
require "mongoid/extensions/object/conversions"
|
19
20
|
require "mongoid/extensions/object/reflections"
|
20
21
|
require "mongoid/extensions/object/yoda"
|
21
22
|
require "mongoid/extensions/proc/scoping"
|
23
|
+
require "mongoid/extensions/range/conversions"
|
22
24
|
require "mongoid/extensions/string/conversions"
|
23
25
|
require "mongoid/extensions/string/inflections"
|
24
26
|
require "mongoid/extensions/symbol/inflections"
|
@@ -80,6 +82,7 @@ class NilClass #:nodoc
|
|
80
82
|
end
|
81
83
|
|
82
84
|
class Object #:nodoc:
|
85
|
+
include Mongoid::Extensions::Object::Checks
|
83
86
|
include Mongoid::Extensions::Object::Conversions
|
84
87
|
include Mongoid::Extensions::Object::Reflections
|
85
88
|
include Mongoid::Extensions::Object::Yoda
|
@@ -89,6 +92,10 @@ class Proc #:nodoc:
|
|
89
92
|
include Mongoid::Extensions::Proc::Scoping
|
90
93
|
end
|
91
94
|
|
95
|
+
class Range
|
96
|
+
include Mongoid::Extensions::Range::Conversions
|
97
|
+
end
|
98
|
+
|
92
99
|
class String #:nodoc
|
93
100
|
include Mongoid::Extensions::String::Inflections
|
94
101
|
include Mongoid::Extensions::String::Conversions
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
module Object #:nodoc:
|
5
|
+
|
6
|
+
# This module has object checks in it.
|
7
|
+
module Checks #:nodoc:
|
8
|
+
|
9
|
+
# Since Active Support's blank? check looks to see if the object
|
10
|
+
# responds to #empty? and will call it if it does, we need another way
|
11
|
+
# to check if the object is empty or nil in case the user has defined a
|
12
|
+
# field called "empty" on the document.
|
13
|
+
#
|
14
|
+
# @example Is the array vacant?
|
15
|
+
# [].vacant?
|
16
|
+
#
|
17
|
+
# @example Is the hash vacant?
|
18
|
+
# {}.vacant?
|
19
|
+
#
|
20
|
+
# @example Is the object vacant?
|
21
|
+
# nil.vacant?
|
22
|
+
#
|
23
|
+
# @return [ true, false ] True if empty or nil, false if not.
|
24
|
+
#
|
25
|
+
# @since 2.0.2
|
26
|
+
def _vacant?
|
27
|
+
is_a?(::Enumerable) || is_a?(::String) ? empty? : !self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|