mongoid 0.4.3 → 0.4.4
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/README.textile +8 -9
- data/VERSION +1 -1
- data/lib/mongoid/associations/has_many_association.rb +37 -16
- data/lib/mongoid/document.rb +4 -1
- data/lib/mongoid/extensions.rb +4 -0
- data/lib/mongoid/extensions/array/parentization.rb +12 -0
- data/lib/mongoid/extensions/object/parentization.rb +12 -0
- data/mongoid.gemspec +7 -1
- data/spec/integration/mongoid/document_spec.rb +20 -0
- data/spec/unit/mongoid/associations/has_many_association_spec.rb +34 -2
- data/spec/unit/mongoid/associations/has_one_association_spec.rb +1 -1
- data/spec/unit/mongoid/document_spec.rb +29 -3
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/object/parentization_spec.rb +19 -0
- metadata +7 -1
data/README.textile
CHANGED
@@ -30,24 +30,23 @@ Example of a simple domain model:
|
|
30
30
|
|
31
31
|
<pre>
|
32
32
|
class Person < Mongoid::Document
|
33
|
-
|
33
|
+
field :title
|
34
|
+
field :age, :default => 0
|
34
35
|
has_many :addresses
|
35
36
|
has_one :name
|
36
37
|
end
|
37
38
|
|
38
39
|
class Address < Mongoid::Document
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
:post_code
|
40
|
+
field :street
|
41
|
+
field :city
|
42
|
+
field :state
|
43
|
+
field :post_code
|
44
44
|
belongs_to :person
|
45
45
|
end
|
46
46
|
|
47
47
|
class Name < Mongoid::Document
|
48
|
-
|
49
|
-
|
50
|
-
:last_name
|
48
|
+
field :first_name
|
49
|
+
field :last_name
|
51
50
|
has_timestamps
|
52
51
|
end
|
53
52
|
</pre>
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.4
|
@@ -2,22 +2,23 @@ module Mongoid #:nodoc:
|
|
2
2
|
module Associations #:nodoc:
|
3
3
|
class HasManyAssociation < DelegateClass(Array) #:nodoc:
|
4
4
|
|
5
|
-
#
|
6
|
-
# the
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
5
|
+
# Appends the object to the +Array+, setting its parent in
|
6
|
+
# the process.
|
7
|
+
def <<(object)
|
8
|
+
object.parentize(@parent)
|
9
|
+
@documents << object
|
10
|
+
end
|
11
|
+
|
12
|
+
# Appends the object to the +Array+, setting its parent in
|
13
|
+
# the process.
|
14
|
+
def push(object)
|
15
|
+
self << object
|
16
|
+
end
|
17
|
+
|
18
|
+
# Appends the object to the +Array+, setting its parent in
|
19
|
+
# the process.
|
20
|
+
def concat(object)
|
21
|
+
self << object
|
21
22
|
end
|
22
23
|
|
23
24
|
# Builds a new Document and adds it to the association collection. The
|
@@ -38,6 +39,26 @@ module Mongoid #:nodoc:
|
|
38
39
|
return @documents if param == :all
|
39
40
|
return detect { |document| document.id == param }
|
40
41
|
end
|
42
|
+
|
43
|
+
# Creates the new association by finding the attributes in
|
44
|
+
# the parent document with its name, and instantiating a
|
45
|
+
# new document for each one found. These will then be put in an
|
46
|
+
# internal array.
|
47
|
+
#
|
48
|
+
# This then delegated all methods to the array class since this is
|
49
|
+
# essentially a proxy to an array itself.
|
50
|
+
def initialize(association_name, document)
|
51
|
+
@parent = document
|
52
|
+
@klass = association_name.to_s.classify.constantize
|
53
|
+
attributes = document.attributes[association_name]
|
54
|
+
@documents = attributes ? attributes.collect do |attribute|
|
55
|
+
child = @klass.new(attribute)
|
56
|
+
child.parent = document
|
57
|
+
child
|
58
|
+
end : []
|
59
|
+
super(@documents)
|
60
|
+
end
|
61
|
+
|
41
62
|
end
|
42
63
|
end
|
43
64
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -28,11 +28,13 @@ module Mongoid #:nodoc:
|
|
28
28
|
|
29
29
|
# Adds the association back to the parent document.
|
30
30
|
def belongs_to(association_name)
|
31
|
+
@embedded = true
|
31
32
|
add_association(:belongs_to, association_name.to_s.classify, association_name)
|
32
33
|
end
|
33
34
|
|
34
35
|
# Get the Mongo::Collection associated with this Document.
|
35
36
|
def collection
|
37
|
+
return nil if @embedded
|
36
38
|
@collection_name = self.to_s.demodulize.tableize
|
37
39
|
@collection ||= Mongoid.database.collection(@collection_name)
|
38
40
|
end
|
@@ -119,7 +121,7 @@ module Mongoid #:nodoc:
|
|
119
121
|
0) do |pager|
|
120
122
|
results = collection.find(selector, { :sort => params[:sort],
|
121
123
|
:limit => pager.per_page,
|
122
|
-
:
|
124
|
+
:skip => pager.offset })
|
123
125
|
pager.total_entries = results.count
|
124
126
|
pager.replace(results.collect { |doc| new(doc) })
|
125
127
|
end
|
@@ -171,6 +173,7 @@ module Mongoid #:nodoc:
|
|
171
173
|
Mongoid::Associations::Factory.create(type, name, self)
|
172
174
|
end
|
173
175
|
define_method("#{name}=") do |object|
|
176
|
+
object.parentize(self)
|
174
177
|
@attributes[name] = object.mongoidize
|
175
178
|
end
|
176
179
|
end
|
data/lib/mongoid/extensions.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
require "mongoid/extensions/array/conversions"
|
2
|
+
require "mongoid/extensions/array/parentization"
|
2
3
|
require "mongoid/extensions/object/conversions"
|
4
|
+
require "mongoid/extensions/object/parentization"
|
3
5
|
|
4
6
|
class Array #:nodoc:
|
5
7
|
include Mongoid::Extensions::Array::Conversions
|
8
|
+
include Mongoid::Extensions::Array::Parentization
|
6
9
|
end
|
7
10
|
|
8
11
|
class Object #:nodoc:
|
9
12
|
include Mongoid::Extensions::Object::Conversions
|
13
|
+
include Mongoid::Extensions::Object::Parentization
|
10
14
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Mongoid #:nodoc:
|
2
|
+
module Extensions #:nodoc:
|
3
|
+
module Array #:nodoc:
|
4
|
+
module Parentization #:nodoc:
|
5
|
+
# Adds the parent document to each element in the array.
|
6
|
+
def parentize(parent)
|
7
|
+
each { |obj| obj.parentize(parent) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/mongoid.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.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"]
|
@@ -39,7 +39,9 @@ Gem::Specification.new do |s|
|
|
39
39
|
"lib/mongoid/document.rb",
|
40
40
|
"lib/mongoid/extensions.rb",
|
41
41
|
"lib/mongoid/extensions/array/conversions.rb",
|
42
|
+
"lib/mongoid/extensions/array/parentization.rb",
|
42
43
|
"lib/mongoid/extensions/object/conversions.rb",
|
44
|
+
"lib/mongoid/extensions/object/parentization.rb",
|
43
45
|
"lib/mongoid/field.rb",
|
44
46
|
"mongoid.gemspec",
|
45
47
|
"spec/integration/mongoid/document_spec.rb",
|
@@ -60,7 +62,9 @@ Gem::Specification.new do |s|
|
|
60
62
|
"spec/unit/mongoid/criteria_spec.rb",
|
61
63
|
"spec/unit/mongoid/document_spec.rb",
|
62
64
|
"spec/unit/mongoid/extensions/array/conversions_spec.rb",
|
65
|
+
"spec/unit/mongoid/extensions/array/parentization_spec.rb",
|
63
66
|
"spec/unit/mongoid/extensions/object/conversions_spec.rb",
|
67
|
+
"spec/unit/mongoid/extensions/object/parentization_spec.rb",
|
64
68
|
"spec/unit/mongoid/field_spec.rb"
|
65
69
|
]
|
66
70
|
s.homepage = %q{http://github.com/durran/mongoid}
|
@@ -86,7 +90,9 @@ Gem::Specification.new do |s|
|
|
86
90
|
"spec/unit/mongoid/criteria_spec.rb",
|
87
91
|
"spec/unit/mongoid/document_spec.rb",
|
88
92
|
"spec/unit/mongoid/extensions/array/conversions_spec.rb",
|
93
|
+
"spec/unit/mongoid/extensions/array/parentization_spec.rb",
|
89
94
|
"spec/unit/mongoid/extensions/object/conversions_spec.rb",
|
95
|
+
"spec/unit/mongoid/extensions/object/parentization_spec.rb",
|
90
96
|
"spec/unit/mongoid/field_spec.rb"
|
91
97
|
]
|
92
98
|
|
@@ -92,4 +92,24 @@ describe Mongoid::Document do
|
|
92
92
|
|
93
93
|
end
|
94
94
|
|
95
|
+
describe "#save" do
|
96
|
+
|
97
|
+
context "on a has_one association" do
|
98
|
+
|
99
|
+
before do
|
100
|
+
@person = Person.new(:title => "Sir")
|
101
|
+
@name = Name.new(:first_name => "Test")
|
102
|
+
@person.name = @name
|
103
|
+
end
|
104
|
+
|
105
|
+
it "saves the parent document" do
|
106
|
+
@name.save
|
107
|
+
person = Person.find(@person.id.to_s)
|
108
|
+
person.name.first_name.should == @name.first_name
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
95
115
|
end
|
@@ -40,11 +40,43 @@ describe Mongoid::Associations::HasManyAssociation do
|
|
40
40
|
|
41
41
|
before do
|
42
42
|
@association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
|
43
|
+
@address = Address.new
|
43
44
|
end
|
44
45
|
|
45
|
-
it "
|
46
|
-
@association <<
|
46
|
+
it "adds the parent document before appending to the array" do
|
47
|
+
@association << @address
|
48
|
+
@association.length.should == 3
|
49
|
+
@address.parent.should == @document
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#concat" do
|
55
|
+
|
56
|
+
before do
|
57
|
+
@association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
|
58
|
+
@address = Address.new
|
59
|
+
end
|
60
|
+
|
61
|
+
it "adds the parent document before appending to the array" do
|
62
|
+
@association.concat [@address]
|
63
|
+
@association.length.should == 3
|
64
|
+
@address.parent.should == @document
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#push" do
|
70
|
+
|
71
|
+
before do
|
72
|
+
@association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
|
73
|
+
@address = Address.new
|
74
|
+
end
|
75
|
+
|
76
|
+
it "adds the parent document before appending to the array" do
|
77
|
+
@association.push @address
|
47
78
|
@association.length.should == 3
|
79
|
+
@address.parent.should == @document
|
48
80
|
end
|
49
81
|
|
50
82
|
end
|
@@ -7,7 +7,7 @@ describe Mongoid::Associations::HasOneAssociation do
|
|
7
7
|
@document = stub(:attributes => @attributes)
|
8
8
|
end
|
9
9
|
|
10
|
-
describe "#
|
10
|
+
describe "#decorate!" do
|
11
11
|
|
12
12
|
before do
|
13
13
|
@association = Mongoid::Associations::HasOneAssociation.new(:name, @document)
|
@@ -58,6 +58,20 @@ describe Mongoid::Document do
|
|
58
58
|
|
59
59
|
end
|
60
60
|
|
61
|
+
describe "#association=" do
|
62
|
+
|
63
|
+
before do
|
64
|
+
@name = Name.new
|
65
|
+
@person = Person.new
|
66
|
+
end
|
67
|
+
|
68
|
+
it "parentizes the association" do
|
69
|
+
@person.name = @name
|
70
|
+
@name.parent.should == @person
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
61
75
|
describe "#belongs_to" do
|
62
76
|
|
63
77
|
it "creates a reader for the association" do
|
@@ -82,6 +96,18 @@ describe Mongoid::Document do
|
|
82
96
|
Person.collection.name.should == "people"
|
83
97
|
end
|
84
98
|
|
99
|
+
context "when document is embedded" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@address = Address.new
|
103
|
+
end
|
104
|
+
|
105
|
+
it "returns nil" do
|
106
|
+
Address.collection.should be_nil
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
85
111
|
end
|
86
112
|
|
87
113
|
describe "#field" do
|
@@ -382,7 +408,7 @@ describe Mongoid::Document do
|
|
382
408
|
context "when pagination parameters are passed" do
|
383
409
|
|
384
410
|
it "delegates to will paginate with the results" do
|
385
|
-
@collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :
|
411
|
+
@collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :skip => 20}).returns(@cursor)
|
386
412
|
Person.paginate(:conditions => { :test => "Test" }, :page => 2, :per_page => 20)
|
387
413
|
end
|
388
414
|
|
@@ -391,7 +417,7 @@ describe Mongoid::Document do
|
|
391
417
|
context "when pagination parameters are not passed" do
|
392
418
|
|
393
419
|
it "delegates to will paginate with default values" do
|
394
|
-
@collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :
|
420
|
+
@collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :skip => 0}).returns(@cursor)
|
395
421
|
Person.paginate(:conditions => { :test => "Test" })
|
396
422
|
end
|
397
423
|
|
@@ -400,7 +426,7 @@ describe Mongoid::Document do
|
|
400
426
|
context "when sorting paramters provided" do
|
401
427
|
|
402
428
|
it "adds the sorting parameters in the collection#find" do
|
403
|
-
@collection.expects(:find).with({ :test => "Test" }, { :sort => { :test => -1}, :limit => 20, :
|
429
|
+
@collection.expects(:find).with({ :test => "Test" }, { :sort => { :test => -1}, :limit => 20, :skip => 0}).returns(@cursor)
|
404
430
|
Person.paginate(:conditions => { :test => "Test" }, :sort => { :test => -1 })
|
405
431
|
end
|
406
432
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "/../../../../spec_helper.rb")
|
2
|
+
|
3
|
+
describe Mongoid::Extensions::Array::Parentization do
|
4
|
+
|
5
|
+
describe "#parentize" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parent = stub
|
9
|
+
@child = mock
|
10
|
+
@array = [@child]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sets the parent on each element" do
|
14
|
+
@child.expects(:parent=).with(@parent)
|
15
|
+
@array.parentize(@parent)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "/../../../../spec_helper.rb")
|
2
|
+
|
3
|
+
describe Mongoid::Extensions::Object::Parentization do
|
4
|
+
|
5
|
+
describe "#parentize" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@parent = Person.new
|
9
|
+
@child = Name.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "sets the parent on each element" do
|
13
|
+
@child.parentize(@parent)
|
14
|
+
@child.parent.should == @parent
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Durran Jordan
|
@@ -85,7 +85,9 @@ files:
|
|
85
85
|
- lib/mongoid/document.rb
|
86
86
|
- lib/mongoid/extensions.rb
|
87
87
|
- lib/mongoid/extensions/array/conversions.rb
|
88
|
+
- lib/mongoid/extensions/array/parentization.rb
|
88
89
|
- lib/mongoid/extensions/object/conversions.rb
|
90
|
+
- lib/mongoid/extensions/object/parentization.rb
|
89
91
|
- lib/mongoid/field.rb
|
90
92
|
- mongoid.gemspec
|
91
93
|
- spec/integration/mongoid/document_spec.rb
|
@@ -106,7 +108,9 @@ files:
|
|
106
108
|
- spec/unit/mongoid/criteria_spec.rb
|
107
109
|
- spec/unit/mongoid/document_spec.rb
|
108
110
|
- spec/unit/mongoid/extensions/array/conversions_spec.rb
|
111
|
+
- spec/unit/mongoid/extensions/array/parentization_spec.rb
|
109
112
|
- spec/unit/mongoid/extensions/object/conversions_spec.rb
|
113
|
+
- spec/unit/mongoid/extensions/object/parentization_spec.rb
|
110
114
|
- spec/unit/mongoid/field_spec.rb
|
111
115
|
has_rdoc: true
|
112
116
|
homepage: http://github.com/durran/mongoid
|
@@ -154,5 +158,7 @@ test_files:
|
|
154
158
|
- spec/unit/mongoid/criteria_spec.rb
|
155
159
|
- spec/unit/mongoid/document_spec.rb
|
156
160
|
- spec/unit/mongoid/extensions/array/conversions_spec.rb
|
161
|
+
- spec/unit/mongoid/extensions/array/parentization_spec.rb
|
157
162
|
- spec/unit/mongoid/extensions/object/conversions_spec.rb
|
163
|
+
- spec/unit/mongoid/extensions/object/parentization_spec.rb
|
158
164
|
- spec/unit/mongoid/field_spec.rb
|