mongoid 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.watchr +20 -2
- data/VERSION +1 -1
- data/caliper.yml +4 -0
- data/lib/mongoid.rb +0 -1
- data/lib/mongoid/associations.rb +25 -13
- data/lib/mongoid/associations/belongs_to.rb +15 -17
- data/lib/mongoid/associations/belongs_to_related.rb +12 -14
- data/lib/mongoid/associations/has_many.rb +53 -35
- data/lib/mongoid/associations/has_many_related.rb +10 -15
- data/lib/mongoid/associations/has_one.rb +31 -30
- data/lib/mongoid/associations/has_one_related.rb +18 -20
- data/lib/mongoid/associations/options.rb +10 -0
- data/lib/mongoid/associations/proxy.rb +18 -1
- data/lib/mongoid/criteria.rb +9 -233
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +63 -0
- data/lib/mongoid/criterion/inclusion.rb +91 -0
- data/lib/mongoid/criterion/optional.rb +96 -0
- data/lib/mongoid/document.rb +2 -2
- data/lib/mongoid/extensions/hash/accessors.rb +6 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +2 -2
- data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
- data/mongoid.gemspec +53 -3
- data/spec/integration/mongoid/associations_spec.rb +41 -0
- data/spec/models/address.rb +39 -0
- data/spec/models/animal.rb +6 -0
- data/spec/models/comment.rb +8 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/game.rb +6 -0
- data/spec/models/inheritance.rb +56 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/patient.rb +4 -0
- data/spec/models/person.rb +97 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +15 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/spec_helper.rb +9 -326
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +26 -5
- data/spec/unit/mongoid/associations/belongs_to_spec.rb +96 -30
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +32 -12
- data/spec/unit/mongoid/associations/has_many_spec.rb +48 -12
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +29 -4
- data/spec/unit/mongoid/associations/has_one_spec.rb +46 -1
- data/spec/unit/mongoid/associations/options_spec.rb +58 -0
- data/spec/unit/mongoid/associations_spec.rb +58 -1
- data/spec/unit/mongoid/criteria_spec.rb +71 -735
- data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +75 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +213 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +244 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +20 -0
- metadata +53 -3
- data/lib/mongoid/complex_criterion.rb +0 -10
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
# Complex criterion are used when performing operations on symbols to get
|
5
|
+
# get a shorthand syntax for where clauses.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# <tt>{ :field => { "$lt" => "value" } }</tt>
|
10
|
+
# becomes:
|
11
|
+
# <tt> { :field.lt => "value }</tt>
|
12
|
+
class Complex
|
13
|
+
attr_accessor :key, :operator
|
14
|
+
|
15
|
+
# Create the new complex criterion.
|
16
|
+
def initialize(opts = {})
|
17
|
+
@key, @operator = opts[:key], opts[:operator]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
module Exclusion
|
5
|
+
# Adds a criterion to the +Criteria+ that specifies values that are not allowed
|
6
|
+
# to match any document in the database. The MongoDB conditional operator that
|
7
|
+
# will be used is "$ne".
|
8
|
+
#
|
9
|
+
# Options:
|
10
|
+
#
|
11
|
+
# attributes: A +Hash+ where the key is the field name and the value is a
|
12
|
+
# value that must not be equal to the corresponding field value in the database.
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
#
|
16
|
+
# <tt>criteria.excludes(:field => "value1")</tt>
|
17
|
+
#
|
18
|
+
# <tt>criteria.excludes(:field1 => "value1", :field2 => "value1")</tt>
|
19
|
+
#
|
20
|
+
# Returns: <tt>self</tt>
|
21
|
+
def excludes(attributes = {})
|
22
|
+
update_selector(attributes, "$ne")
|
23
|
+
end
|
24
|
+
|
25
|
+
# Adds a criterion to the +Criteria+ that specifies values where none
|
26
|
+
# should match in order to return results. This is similar to an SQL "NOT IN"
|
27
|
+
# clause. The MongoDB conditional operator that will be used is "$nin".
|
28
|
+
#
|
29
|
+
# Options:
|
30
|
+
#
|
31
|
+
# exclusions: A +Hash+ where the key is the field name and the value is an
|
32
|
+
# +Array+ of values that none can match.
|
33
|
+
#
|
34
|
+
# Example:
|
35
|
+
#
|
36
|
+
# <tt>criteria.not_in(:field => ["value1", "value2"])</tt>
|
37
|
+
#
|
38
|
+
# <tt>criteria.not_in(:field1 => ["value1", "value2"], :field2 => ["value1"])</tt>
|
39
|
+
#
|
40
|
+
# Returns: <tt>self</tt>
|
41
|
+
def not_in(exclusions)
|
42
|
+
exclusions.each { |key, value| @selector[key] = { "$nin" => value } }; self
|
43
|
+
end
|
44
|
+
|
45
|
+
# Adds a criterion to the +Criteria+ that specifies the fields that will
|
46
|
+
# get returned from the Document. Used mainly for list views that do not
|
47
|
+
# require all fields to be present. This is similar to SQL "SELECT" values.
|
48
|
+
#
|
49
|
+
# Options:
|
50
|
+
#
|
51
|
+
# args: A list of field names to retrict the returned fields to.
|
52
|
+
#
|
53
|
+
# Example:
|
54
|
+
#
|
55
|
+
# <tt>criteria.only(:field1, :field2, :field3)</tt>
|
56
|
+
#
|
57
|
+
# Returns: <tt>self</tt>
|
58
|
+
def only(*args)
|
59
|
+
@options[:fields] = args.flatten if args.any?; self
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
module Inclusion
|
5
|
+
# Adds a criterion to the +Criteria+ that specifies values that must all
|
6
|
+
# be matched in order to return results. Similar to an "in" clause but the
|
7
|
+
# underlying conditional logic is an "AND" and not an "OR". The MongoDB
|
8
|
+
# conditional operator that will be used is "$all".
|
9
|
+
#
|
10
|
+
# Options:
|
11
|
+
#
|
12
|
+
# attributes: A +Hash+ where the key is the field name and the value is an
|
13
|
+
# +Array+ of values that must all match.
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# <tt>criteria.all(:field => ["value1", "value2"])</tt>
|
18
|
+
#
|
19
|
+
# <tt>criteria.all(:field1 => ["value1", "value2"], :field2 => ["value1"])</tt>
|
20
|
+
#
|
21
|
+
# Returns: <tt>self</tt>
|
22
|
+
def all(attributes = {})
|
23
|
+
update_selector(attributes, "$all")
|
24
|
+
end
|
25
|
+
|
26
|
+
# Adds a criterion to the +Criteria+ that specifies values that must
|
27
|
+
# be matched in order to return results. This is similar to a SQL "WHERE"
|
28
|
+
# clause. This is the actual selector that will be provided to MongoDB,
|
29
|
+
# similar to the Javascript object that is used when performing a find()
|
30
|
+
# in the MongoDB console.
|
31
|
+
#
|
32
|
+
# Options:
|
33
|
+
#
|
34
|
+
# selectior: A +Hash+ that must match the attributes of the +Document+.
|
35
|
+
#
|
36
|
+
# Example:
|
37
|
+
#
|
38
|
+
# <tt>criteria.and(:field1 => "value1", :field2 => 15)</tt>
|
39
|
+
#
|
40
|
+
# Returns: <tt>self</tt>
|
41
|
+
def and(selector = nil)
|
42
|
+
where(selector)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Adds a criterion to the +Criteria+ that specifies values where any can
|
46
|
+
# be matched in order to return results. This is similar to an SQL "IN"
|
47
|
+
# clause. The MongoDB conditional operator that will be used is "$in".
|
48
|
+
#
|
49
|
+
# Options:
|
50
|
+
#
|
51
|
+
# attributes: A +Hash+ where the key is the field name and the value is an
|
52
|
+
# +Array+ of values that any can match.
|
53
|
+
#
|
54
|
+
# Example:
|
55
|
+
#
|
56
|
+
# <tt>criteria.in(:field => ["value1", "value2"])</tt>
|
57
|
+
#
|
58
|
+
# <tt>criteria.in(:field1 => ["value1", "value2"], :field2 => ["value1"])</tt>
|
59
|
+
#
|
60
|
+
# Returns: <tt>self</tt>
|
61
|
+
def in(attributes = {})
|
62
|
+
update_selector(attributes, "$in")
|
63
|
+
end
|
64
|
+
|
65
|
+
# Adds a criterion to the +Criteria+ that specifies values that must
|
66
|
+
# be matched in order to return results. This is similar to a SQL "WHERE"
|
67
|
+
# clause. This is the actual selector that will be provided to MongoDB,
|
68
|
+
# similar to the Javascript object that is used when performing a find()
|
69
|
+
# in the MongoDB console.
|
70
|
+
#
|
71
|
+
# Options:
|
72
|
+
#
|
73
|
+
# selectior: A +Hash+ that must match the attributes of the +Document+.
|
74
|
+
#
|
75
|
+
# Example:
|
76
|
+
#
|
77
|
+
# <tt>criteria.where(:field1 => "value1", :field2 => 15)</tt>
|
78
|
+
#
|
79
|
+
# Returns: <tt>self</tt>
|
80
|
+
def where(selector = nil)
|
81
|
+
case selector
|
82
|
+
when String
|
83
|
+
@selector.update("$where" => selector)
|
84
|
+
else
|
85
|
+
@selector.update(selector ? selector.expand_complex_criteria : {})
|
86
|
+
end
|
87
|
+
self
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
module Optional
|
5
|
+
# Adds a criterion to the +Criteria+ that specifies additional options
|
6
|
+
# to be passed to the Ruby driver, in the exact format for the driver.
|
7
|
+
#
|
8
|
+
# Options:
|
9
|
+
#
|
10
|
+
# extras: A +Hash+ that gets set to the driver options.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# <tt>criteria.extras(:limit => 20, :skip => 40)</tt>
|
15
|
+
#
|
16
|
+
# Returns: <tt>self</tt>
|
17
|
+
def extras(extras)
|
18
|
+
@options.merge!(extras); filter_options; self
|
19
|
+
end
|
20
|
+
|
21
|
+
# Adds a criterion to the +Criteria+ that specifies an id that must be matched.
|
22
|
+
#
|
23
|
+
# Options:
|
24
|
+
#
|
25
|
+
# object_id: A +String+ representation of a <tt>Mongo::ObjectID</tt>
|
26
|
+
#
|
27
|
+
# Example:
|
28
|
+
#
|
29
|
+
# <tt>criteria.id("4ab2bc4b8ad548971900005c")</tt>
|
30
|
+
#
|
31
|
+
# Returns: <tt>self</tt>
|
32
|
+
def id(*args)
|
33
|
+
(args.flatten.size > 1) ? self.in(:_id => args.flatten) : (@selector[:_id] = args.first)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
# Adds a criterion to the +Criteria+ that specifies the maximum number of
|
38
|
+
# results to return. This is mostly used in conjunction with <tt>skip()</tt>
|
39
|
+
# to handle paginated results.
|
40
|
+
#
|
41
|
+
# Options:
|
42
|
+
#
|
43
|
+
# value: An +Integer+ specifying the max number of results. Defaults to 20.
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# <tt>criteria.limit(100)</tt>
|
48
|
+
#
|
49
|
+
# Returns: <tt>self</tt>
|
50
|
+
def limit(value = 20)
|
51
|
+
@options[:limit] = value; self
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns the offset option. If a per_page option is in the list then it
|
55
|
+
# will replace it with a skip parameter and return the same value. Defaults
|
56
|
+
# to 20 if nothing was provided.
|
57
|
+
def offset
|
58
|
+
@options[:skip]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Adds a criterion to the +Criteria+ that specifies the sort order of
|
62
|
+
# the returned documents in the database. Similar to a SQL "ORDER BY".
|
63
|
+
#
|
64
|
+
# Options:
|
65
|
+
#
|
66
|
+
# params: An +Array+ of [field, direction] sorting pairs.
|
67
|
+
#
|
68
|
+
# Example:
|
69
|
+
#
|
70
|
+
# <tt>criteria.order_by([[:field1, :asc], [:field2, :desc]])</tt>
|
71
|
+
#
|
72
|
+
# Returns: <tt>self</tt>
|
73
|
+
def order_by(params = [])
|
74
|
+
@options[:sort] = params; self
|
75
|
+
end
|
76
|
+
|
77
|
+
# Adds a criterion to the +Criteria+ that specifies how many results to skip
|
78
|
+
# when returning Documents. This is mostly used in conjunction with
|
79
|
+
# <tt>limit()</tt> to handle paginated results, and is similar to the
|
80
|
+
# traditional "offset" parameter.
|
81
|
+
#
|
82
|
+
# Options:
|
83
|
+
#
|
84
|
+
# value: An +Integer+ specifying the number of results to skip. Defaults to 0.
|
85
|
+
#
|
86
|
+
# Example:
|
87
|
+
#
|
88
|
+
# <tt>criteria.skip(20)</tt>
|
89
|
+
#
|
90
|
+
# Returns: <tt>self</tt>
|
91
|
+
def skip(value = 0)
|
92
|
+
@options[:skip] = value; self
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -262,8 +262,8 @@ module Mongoid #:nodoc:
|
|
262
262
|
# Example:
|
263
263
|
#
|
264
264
|
# <tt>person.to_json</tt>
|
265
|
-
def to_json
|
266
|
-
attributes.to_json
|
265
|
+
def to_json(options=nil)
|
266
|
+
attributes.to_json(options)
|
267
267
|
end
|
268
268
|
|
269
269
|
# Returns the id of the Document, used in Rails compatibility.
|
@@ -26,6 +26,12 @@ module Mongoid #:nodoc:
|
|
26
26
|
self[key] = key.singular? ? attrs : [attrs]
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
# If a _type key exists in the hash, return the class for the value.
|
31
|
+
def klass
|
32
|
+
class_name = self["_type"]
|
33
|
+
class_name ? class_name.constantize : nil
|
34
|
+
end
|
29
35
|
end
|
30
36
|
end
|
31
37
|
end
|
@@ -6,7 +6,7 @@ module Mongoid #:nodoc:
|
|
6
6
|
def expand_complex_criteria
|
7
7
|
hsh = {}
|
8
8
|
self.each_pair do |k,v|
|
9
|
-
if k.class == Mongoid::
|
9
|
+
if k.class == Mongoid::Criterion::Complex
|
10
10
|
hsh[k.key] = {"$#{k.operator}" => v}
|
11
11
|
else
|
12
12
|
hsh[k] = v
|
@@ -17,4 +17,4 @@ module Mongoid #:nodoc:
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -26,7 +26,7 @@ module Mongoid #:nodoc:
|
|
26
26
|
["gt", "lt", "gte", "lte", "ne", "in", "nin", "mod", "all", "size", "exists"].each do |oper|
|
27
27
|
class_eval <<-OPERATORS
|
28
28
|
def #{oper}
|
29
|
-
|
29
|
+
Criterion::Complex.new(:key => self, :operator => "#{oper}")
|
30
30
|
end
|
31
31
|
OPERATORS
|
32
32
|
end
|
data/mongoid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid}
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Durran Jordan"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-26}
|
13
13
|
s.email = %q{durran@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.rdoc"
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
"README.rdoc",
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
|
+
"caliper.yml",
|
25
26
|
"lib/mongoid.rb",
|
26
27
|
"lib/mongoid/associations.rb",
|
27
28
|
"lib/mongoid/associations/belongs_to.rb",
|
@@ -42,7 +43,6 @@ Gem::Specification.new do |s|
|
|
42
43
|
"lib/mongoid/commands/destroy.rb",
|
43
44
|
"lib/mongoid/commands/destroy_all.rb",
|
44
45
|
"lib/mongoid/commands/save.rb",
|
45
|
-
"lib/mongoid/complex_criterion.rb",
|
46
46
|
"lib/mongoid/components.rb",
|
47
47
|
"lib/mongoid/config.rb",
|
48
48
|
"lib/mongoid/contexts.rb",
|
@@ -50,6 +50,10 @@ Gem::Specification.new do |s|
|
|
50
50
|
"lib/mongoid/contexts/mongo.rb",
|
51
51
|
"lib/mongoid/contexts/paging.rb",
|
52
52
|
"lib/mongoid/criteria.rb",
|
53
|
+
"lib/mongoid/criterion/complex.rb",
|
54
|
+
"lib/mongoid/criterion/exclusion.rb",
|
55
|
+
"lib/mongoid/criterion/inclusion.rb",
|
56
|
+
"lib/mongoid/criterion/optional.rb",
|
53
57
|
"lib/mongoid/document.rb",
|
54
58
|
"lib/mongoid/errors.rb",
|
55
59
|
"lib/mongoid/extensions.rb",
|
@@ -107,6 +111,25 @@ Gem::Specification.new do |s|
|
|
107
111
|
"spec/integration/mongoid/finders_spec.rb",
|
108
112
|
"spec/integration/mongoid/inheritance_spec.rb",
|
109
113
|
"spec/integration/mongoid/named_scope_spec.rb",
|
114
|
+
"spec/models/address.rb",
|
115
|
+
"spec/models/animal.rb",
|
116
|
+
"spec/models/comment.rb",
|
117
|
+
"spec/models/country_code.rb",
|
118
|
+
"spec/models/employer.rb",
|
119
|
+
"spec/models/game.rb",
|
120
|
+
"spec/models/inheritance.rb",
|
121
|
+
"spec/models/location.rb",
|
122
|
+
"spec/models/mixed_drink.rb",
|
123
|
+
"spec/models/name.rb",
|
124
|
+
"spec/models/namespacing.rb",
|
125
|
+
"spec/models/patient.rb",
|
126
|
+
"spec/models/person.rb",
|
127
|
+
"spec/models/pet.rb",
|
128
|
+
"spec/models/pet_owner.rb",
|
129
|
+
"spec/models/phone.rb",
|
130
|
+
"spec/models/post.rb",
|
131
|
+
"spec/models/translation.rb",
|
132
|
+
"spec/models/vet_visit.rb",
|
110
133
|
"spec/spec.opts",
|
111
134
|
"spec/spec_helper.rb",
|
112
135
|
"spec/unit/mongoid/associations/belongs_to_related_spec.rb",
|
@@ -130,6 +153,10 @@ Gem::Specification.new do |s|
|
|
130
153
|
"spec/unit/mongoid/contexts/enumerable_spec.rb",
|
131
154
|
"spec/unit/mongoid/contexts/mongo_spec.rb",
|
132
155
|
"spec/unit/mongoid/criteria_spec.rb",
|
156
|
+
"spec/unit/mongoid/criterion/complex_spec.rb",
|
157
|
+
"spec/unit/mongoid/criterion/exclusion_spec.rb",
|
158
|
+
"spec/unit/mongoid/criterion/inclusion_spec.rb",
|
159
|
+
"spec/unit/mongoid/criterion/optional_spec.rb",
|
133
160
|
"spec/unit/mongoid/document_spec.rb",
|
134
161
|
"spec/unit/mongoid/errors_spec.rb",
|
135
162
|
"spec/unit/mongoid/extensions/array/accessors_spec.rb",
|
@@ -192,6 +219,25 @@ Gem::Specification.new do |s|
|
|
192
219
|
"spec/integration/mongoid/finders_spec.rb",
|
193
220
|
"spec/integration/mongoid/inheritance_spec.rb",
|
194
221
|
"spec/integration/mongoid/named_scope_spec.rb",
|
222
|
+
"spec/models/address.rb",
|
223
|
+
"spec/models/animal.rb",
|
224
|
+
"spec/models/comment.rb",
|
225
|
+
"spec/models/country_code.rb",
|
226
|
+
"spec/models/employer.rb",
|
227
|
+
"spec/models/game.rb",
|
228
|
+
"spec/models/inheritance.rb",
|
229
|
+
"spec/models/location.rb",
|
230
|
+
"spec/models/mixed_drink.rb",
|
231
|
+
"spec/models/name.rb",
|
232
|
+
"spec/models/namespacing.rb",
|
233
|
+
"spec/models/patient.rb",
|
234
|
+
"spec/models/person.rb",
|
235
|
+
"spec/models/pet.rb",
|
236
|
+
"spec/models/pet_owner.rb",
|
237
|
+
"spec/models/phone.rb",
|
238
|
+
"spec/models/post.rb",
|
239
|
+
"spec/models/translation.rb",
|
240
|
+
"spec/models/vet_visit.rb",
|
195
241
|
"spec/spec_helper.rb",
|
196
242
|
"spec/unit/mongoid/associations/belongs_to_related_spec.rb",
|
197
243
|
"spec/unit/mongoid/associations/belongs_to_spec.rb",
|
@@ -214,6 +260,10 @@ Gem::Specification.new do |s|
|
|
214
260
|
"spec/unit/mongoid/contexts/enumerable_spec.rb",
|
215
261
|
"spec/unit/mongoid/contexts/mongo_spec.rb",
|
216
262
|
"spec/unit/mongoid/criteria_spec.rb",
|
263
|
+
"spec/unit/mongoid/criterion/complex_spec.rb",
|
264
|
+
"spec/unit/mongoid/criterion/exclusion_spec.rb",
|
265
|
+
"spec/unit/mongoid/criterion/inclusion_spec.rb",
|
266
|
+
"spec/unit/mongoid/criterion/optional_spec.rb",
|
217
267
|
"spec/unit/mongoid/document_spec.rb",
|
218
268
|
"spec/unit/mongoid/errors_spec.rb",
|
219
269
|
"spec/unit/mongoid/extensions/array/accessors_spec.rb",
|
@@ -8,6 +8,47 @@ describe Mongoid::Associations do
|
|
8
8
|
Post.delete_all
|
9
9
|
end
|
10
10
|
|
11
|
+
context "anonymous extensions" do
|
12
|
+
|
13
|
+
before do
|
14
|
+
@person = Person.new(:title => "Dr")
|
15
|
+
@address_one = Address.new(:street => "Oxford")
|
16
|
+
@address_two = Address.new(:street => "Bond")
|
17
|
+
@name = Name.new(:first_name => "Richard", :last_name => "Dawkins")
|
18
|
+
@person.addresses << [ @address_one, @address_two ]
|
19
|
+
@person.name = @name
|
20
|
+
@person.save
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when defined on a has_many" do
|
24
|
+
|
25
|
+
it "applies the extension" do
|
26
|
+
addresses = @person.addresses.find_by_street("Oxford")
|
27
|
+
addresses.size.should == 1
|
28
|
+
addresses.first.should == @address_one
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when defined on a has_one" do
|
34
|
+
|
35
|
+
it "applies the extension" do
|
36
|
+
name = @person.name
|
37
|
+
name.dawkins?.should be_true
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when defined on a belongs_to" do
|
43
|
+
|
44
|
+
it "applies the extension" do
|
45
|
+
@address_two.addressable.doctor?.should be_true
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
11
52
|
context "criteria on has many embedded associations" do
|
12
53
|
|
13
54
|
before do
|