jnunemaker-mongomapper 0.3.1 → 0.3.2
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/History +11 -0
- data/VERSION +1 -1
- data/lib/mongomapper/associations/base.rb +5 -2
- data/lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb +1 -2
- data/lib/mongomapper/associations/belongs_to_proxy.rb +3 -3
- data/lib/mongomapper/associations/many_documents_proxy.rb +85 -0
- data/lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb +2 -3
- data/lib/mongomapper/associations/many_embedded_proxy.rb +2 -4
- data/lib/mongomapper/associations/many_polymorphic_proxy.rb +11 -0
- data/lib/mongomapper/associations/many_proxy.rb +1 -50
- data/lib/mongomapper/associations/proxy.rb +1 -1
- data/lib/mongomapper/document.rb +5 -12
- data/lib/mongomapper/embedded_document.rb +21 -2
- data/lib/mongomapper/key.rb +2 -1
- data/lib/mongomapper/serializers/json_serializer.rb +15 -0
- data/lib/mongomapper.rb +17 -10
- data/mongomapper.gemspec +17 -4
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +39 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +35 -0
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +131 -0
- data/test/functional/associations/test_many_embedded_proxy.rb +106 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +259 -0
- data/test/functional/associations/test_many_proxy.rb +236 -0
- data/test/functional/test_associations.rb +22 -467
- data/test/functional/test_document.rb +76 -19
- data/test/functional/test_pagination.rb +2 -3
- data/test/models.rb +16 -0
- data/test/test_helper.rb +1 -1
- data/test/unit/serializers/test_json_serializer.rb +69 -16
- data/test/unit/test_association_base.rb +5 -0
- data/test/unit/test_document.rb +14 -4
- data/test/unit/test_embedded_document.rb +46 -21
- data/test/unit/test_key.rb +5 -0
- data/test/unit/test_mongo_id.rb +2 -2
- data/test/unit/test_rails_compatibility.rb +3 -3
- metadata +16 -3
- data/lib/mongomapper/associations/array_proxy.rb +0 -6
data/History
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
0.3.2 8/6/2009
|
2
|
+
* Added many polymorphic documents association
|
3
|
+
* Implemented build and create for many and many polymorphic documents
|
4
|
+
* <<, push and concat now work correctly for many and many polymorphic documents
|
5
|
+
* find(:first) now accepts order option
|
6
|
+
* id is now included by default with to_json
|
7
|
+
* _id is now always excluded from to_json
|
8
|
+
* Times are now always returned as UTC
|
9
|
+
* Default values are now a bit more intelligent for Array and Hash keys (djsun)
|
10
|
+
* Embedded documents now have _id as well so they can be identified more easily
|
11
|
+
|
1
12
|
0.3.1 7/28/2009
|
2
13
|
* 1 minor tweak
|
3
14
|
* Removed deep_merge gem as dependency as ActiveSupport has deep_merge that works good enough
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
@@ -56,8 +56,11 @@ module MongoMapper
|
|
56
56
|
def proxy_class
|
57
57
|
@proxy_class ||= begin
|
58
58
|
if many?
|
59
|
-
|
60
|
-
|
59
|
+
if self.klass.embeddable?
|
60
|
+
polymorphic? ? ManyEmbeddedPolymorphicProxy : ManyEmbeddedProxy
|
61
|
+
else
|
62
|
+
polymorphic? ? ManyPolymorphicProxy : ManyProxy
|
63
|
+
end
|
61
64
|
else
|
62
65
|
polymorphic? ? BelongsToPolymorphicProxy : BelongsToProxy
|
63
66
|
end
|
@@ -8,13 +8,13 @@ module MongoMapper
|
|
8
8
|
end
|
9
9
|
|
10
10
|
@owner.send("#{@association.belongs_to_key_name}=", id)
|
11
|
-
|
11
|
+
reset
|
12
12
|
end
|
13
13
|
|
14
14
|
protected
|
15
15
|
def find_target
|
16
|
-
if
|
17
|
-
@association.klass.find(
|
16
|
+
if association_id = @owner.send(@association.belongs_to_key_name)
|
17
|
+
@association.klass.find(association_id)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Associations
|
3
|
+
class ManyDocumentsProxy < Proxy
|
4
|
+
delegate :klass, :to => :@association
|
5
|
+
|
6
|
+
def find(*args)
|
7
|
+
options = args.extract_options!
|
8
|
+
klass.find(*args << scoped_options(options))
|
9
|
+
end
|
10
|
+
|
11
|
+
def paginate(options)
|
12
|
+
klass.paginate(scoped_options(options))
|
13
|
+
end
|
14
|
+
|
15
|
+
def all(options={})
|
16
|
+
find(:all, scoped_options(options))
|
17
|
+
end
|
18
|
+
|
19
|
+
def first(options={})
|
20
|
+
find(:first, scoped_options(options))
|
21
|
+
end
|
22
|
+
|
23
|
+
def last(options={})
|
24
|
+
find(:last, scoped_options(options))
|
25
|
+
end
|
26
|
+
|
27
|
+
def count(conditions={})
|
28
|
+
klass.count(conditions.deep_merge(scoped_conditions))
|
29
|
+
end
|
30
|
+
|
31
|
+
def replace(docs)
|
32
|
+
@target.map(&:destroy) if load_target
|
33
|
+
docs.each { |doc| apply_scope(doc).save }
|
34
|
+
reset
|
35
|
+
end
|
36
|
+
|
37
|
+
def <<(*docs)
|
38
|
+
ensure_owner_saved
|
39
|
+
flatten_deeper(docs).each { |doc| apply_scope(doc).save }
|
40
|
+
reset
|
41
|
+
end
|
42
|
+
alias_method :push, :<<
|
43
|
+
alias_method :concat, :<<
|
44
|
+
|
45
|
+
def build(attrs={})
|
46
|
+
doc = klass.new(attrs)
|
47
|
+
apply_scope(doc)
|
48
|
+
doc
|
49
|
+
end
|
50
|
+
|
51
|
+
def create(attrs={})
|
52
|
+
doc = klass.new(attrs)
|
53
|
+
apply_scope(doc).save
|
54
|
+
doc
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
def scoped_conditions
|
59
|
+
{self.foreign_key => @owner.id}
|
60
|
+
end
|
61
|
+
|
62
|
+
def scoped_options(options)
|
63
|
+
options.deep_merge({:conditions => scoped_conditions})
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_target
|
67
|
+
find(:all)
|
68
|
+
end
|
69
|
+
|
70
|
+
def ensure_owner_saved
|
71
|
+
@owner.save if @owner.new?
|
72
|
+
end
|
73
|
+
|
74
|
+
def apply_scope(doc)
|
75
|
+
ensure_owner_saved
|
76
|
+
doc.send("#{self.foreign_key}=", @owner.id)
|
77
|
+
doc
|
78
|
+
end
|
79
|
+
|
80
|
+
def foreign_key
|
81
|
+
@association.options[:foreign_key] || @owner.class.name.underscore.gsub("/", "_") + "_id"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module Associations
|
3
|
-
class ManyEmbeddedPolymorphicProxy <
|
3
|
+
class ManyEmbeddedPolymorphicProxy < Proxy
|
4
4
|
def replace(v)
|
5
5
|
@_values = v.map do |doc_or_hash|
|
6
6
|
if doc_or_hash.kind_of?(EmbeddedDocument)
|
@@ -11,8 +11,7 @@ module MongoMapper
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
reload_target
|
14
|
+
reset
|
16
15
|
end
|
17
16
|
|
18
17
|
protected
|
@@ -1,11 +1,9 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module Associations
|
3
|
-
class ManyEmbeddedProxy <
|
3
|
+
class ManyEmbeddedProxy < Proxy
|
4
4
|
def replace(v)
|
5
5
|
@_values = v.map { |e| e.kind_of?(EmbeddedDocument) ? e.attributes : e }
|
6
|
-
|
7
|
-
|
8
|
-
reload_target
|
6
|
+
reset
|
9
7
|
end
|
10
8
|
|
11
9
|
protected
|
@@ -1,55 +1,6 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module Associations
|
3
|
-
class ManyProxy <
|
4
|
-
delegate :klass, :to => :@association
|
5
|
-
|
6
|
-
def find(*args)
|
7
|
-
options = args.extract_options!
|
8
|
-
klass.find(*args << scoped_options(options))
|
9
|
-
end
|
10
|
-
|
11
|
-
def paginate(options)
|
12
|
-
klass.paginate(scoped_options(options))
|
13
|
-
end
|
14
|
-
|
15
|
-
def all(options={})
|
16
|
-
find(:all, scoped_options(options))
|
17
|
-
end
|
18
|
-
|
19
|
-
def first(options={})
|
20
|
-
find(:first, scoped_options(options))
|
21
|
-
end
|
22
|
-
|
23
|
-
def last(options={})
|
24
|
-
find(:last, scoped_options(options))
|
25
|
-
end
|
26
|
-
|
27
|
-
def replace(docs)
|
28
|
-
if load_target
|
29
|
-
@target.map(&:destroy)
|
30
|
-
end
|
31
|
-
|
32
|
-
docs.each do |doc|
|
33
|
-
@owner.save if @owner.new?
|
34
|
-
doc.send(:write_attribute, self.foreign_key, @owner.id)
|
35
|
-
doc.save
|
36
|
-
end
|
37
|
-
|
38
|
-
reload_target
|
39
|
-
end
|
40
|
-
|
41
|
-
protected
|
42
|
-
def scoped_options(options)
|
43
|
-
options.dup.deep_merge({:conditions => {self.foreign_key => @owner.id}})
|
44
|
-
end
|
45
|
-
|
46
|
-
def find_target
|
47
|
-
find(:all)
|
48
|
-
end
|
49
|
-
|
50
|
-
def foreign_key
|
51
|
-
@association.options[:foreign_key] || @owner.class.name.underscore.gsub("/", "_") + "_id"
|
52
|
-
end
|
3
|
+
class ManyProxy < ManyDocumentsProxy
|
53
4
|
end
|
54
5
|
end
|
55
6
|
end
|
data/lib/mongomapper/document.rb
CHANGED
@@ -12,7 +12,6 @@ module MongoMapper
|
|
12
12
|
include RailsCompatibility::Document
|
13
13
|
extend ClassMethods
|
14
14
|
|
15
|
-
key :_id, MongoID
|
16
15
|
key :created_at, Time
|
17
16
|
key :updated_at, Time
|
18
17
|
end
|
@@ -162,7 +161,8 @@ module MongoMapper
|
|
162
161
|
end
|
163
162
|
|
164
163
|
def find_first(options)
|
165
|
-
|
164
|
+
options.merge!(:limit => 1)
|
165
|
+
find_every({:order => '$natural asc'}.merge(options))[0]
|
166
166
|
end
|
167
167
|
|
168
168
|
def find_last(options)
|
@@ -247,14 +247,6 @@ module MongoMapper
|
|
247
247
|
freeze
|
248
248
|
end
|
249
249
|
|
250
|
-
def ==(other)
|
251
|
-
other.is_a?(self.class) && id == other.id
|
252
|
-
end
|
253
|
-
|
254
|
-
def id
|
255
|
-
read_attribute('_id').to_s
|
256
|
-
end
|
257
|
-
|
258
250
|
private
|
259
251
|
def create_or_update
|
260
252
|
result = new? ? create : update
|
@@ -277,8 +269,9 @@ module MongoMapper
|
|
277
269
|
end
|
278
270
|
|
279
271
|
def update_timestamps
|
280
|
-
|
281
|
-
write_attribute('
|
272
|
+
now = Time.now.utc
|
273
|
+
write_attribute('created_at', now) if new?
|
274
|
+
write_attribute('updated_at', now)
|
282
275
|
end
|
283
276
|
end
|
284
277
|
end # Document
|
@@ -13,11 +13,17 @@ module MongoMapper
|
|
13
13
|
include RailsCompatibility::EmbeddedDocument
|
14
14
|
include Validatable
|
15
15
|
include Serialization
|
16
|
+
|
17
|
+
key :_id, MongoID
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
module ClassMethods
|
20
22
|
def inherited(subclass)
|
23
|
+
unless subclass.embeddable?
|
24
|
+
subclass.collection(self.collection.name)
|
25
|
+
end
|
26
|
+
|
21
27
|
(@subclasses ||= []) << subclass
|
22
28
|
end
|
23
29
|
|
@@ -141,6 +147,10 @@ module MongoMapper
|
|
141
147
|
|
142
148
|
self.attributes = attrs
|
143
149
|
end
|
150
|
+
|
151
|
+
if self.class.embeddable? && read_attribute(:_id).blank?
|
152
|
+
write_attribute :_id, XGen::Mongo::Driver::ObjectID.new
|
153
|
+
end
|
144
154
|
end
|
145
155
|
|
146
156
|
def attributes=(attrs)
|
@@ -170,7 +180,15 @@ module MongoMapper
|
|
170
180
|
end
|
171
181
|
|
172
182
|
def ==(other)
|
173
|
-
other.is_a?(self.class) &&
|
183
|
+
other.is_a?(self.class) && id == other.id
|
184
|
+
end
|
185
|
+
|
186
|
+
def id
|
187
|
+
self._id.to_s
|
188
|
+
end
|
189
|
+
|
190
|
+
def id=(value)
|
191
|
+
self._id = value
|
174
192
|
end
|
175
193
|
|
176
194
|
def inspect
|
@@ -191,7 +209,8 @@ module MongoMapper
|
|
191
209
|
end
|
192
210
|
|
193
211
|
def read_attribute(name)
|
194
|
-
self.class.keys[name].get(instance_variable_get("@#{name}"))
|
212
|
+
value = self.class.keys[name].get(instance_variable_get("@#{name}"))
|
213
|
+
instance_variable_set "@#{name}", value
|
195
214
|
end
|
196
215
|
|
197
216
|
def read_attribute_before_typecast(name)
|
data/lib/mongomapper/key.rb
CHANGED
@@ -41,12 +41,13 @@ module MongoMapper
|
|
41
41
|
private
|
42
42
|
def typecast(value)
|
43
43
|
return HashWithIndifferentAccess.new(value) if value.is_a?(Hash) && type == Hash
|
44
|
+
return value.utc if type == Time && value.kind_of?(type)
|
44
45
|
return value if value.kind_of?(type) || value.nil?
|
45
46
|
begin
|
46
47
|
if type == String then value.to_s
|
47
48
|
elsif type == Float then value.to_f
|
48
49
|
elsif type == Array then value.to_a
|
49
|
-
elsif type == Time then Time.parse(value.to_s)
|
50
|
+
elsif type == Time then Time.parse(value.to_s).utc
|
50
51
|
elsif type == MongoID then MongoID.mm_typecast(value)
|
51
52
|
#elsif type == Date then Date.parse(value.to_s)
|
52
53
|
elsif type == Boolean then Boolean.mm_typecast(value)
|
@@ -50,6 +50,8 @@ module MongoMapper #:nodoc:
|
|
50
50
|
# "created_at": "2006/08/01", "awesome": true,
|
51
51
|
# "permalink": "1-konata-izumi"}
|
52
52
|
def to_json(options = {})
|
53
|
+
apply_to_json_defaults(options)
|
54
|
+
|
53
55
|
if include_root_in_json
|
54
56
|
"{#{self.class.json_class_name}: #{JsonSerializer.new(self, options).to_s}}"
|
55
57
|
else
|
@@ -73,5 +75,18 @@ module MongoMapper #:nodoc:
|
|
73
75
|
@json_class_name ||= name.demodulize.underscore.inspect
|
74
76
|
end
|
75
77
|
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def apply_to_json_defaults(options)
|
81
|
+
unless options[:only]
|
82
|
+
methods = [options.delete(:methods)].flatten.compact
|
83
|
+
methods << :id
|
84
|
+
options[:methods] = methods.uniq
|
85
|
+
end
|
86
|
+
|
87
|
+
except = [options.delete(:except)].flatten.compact
|
88
|
+
except << :_id
|
89
|
+
options[:except] = except
|
90
|
+
end
|
76
91
|
end
|
77
92
|
end
|
data/lib/mongomapper.rb
CHANGED
@@ -29,7 +29,7 @@ class MongoID < XGen::Mongo::Driver::ObjectID
|
|
29
29
|
end
|
30
30
|
rescue => exception
|
31
31
|
if exception.message == 'illegal ObjectID format'
|
32
|
-
raise MongoMapper::
|
32
|
+
raise MongoMapper::IllegalID
|
33
33
|
else
|
34
34
|
raise exception
|
35
35
|
end
|
@@ -40,31 +40,38 @@ end
|
|
40
40
|
dir = Pathname(__FILE__).dirname.expand_path + 'mongomapper'
|
41
41
|
|
42
42
|
require dir + 'associations'
|
43
|
-
require dir + 'associations/proxy'
|
44
|
-
require dir + 'associations/array_proxy'
|
45
43
|
require dir + 'associations/base'
|
44
|
+
|
45
|
+
require dir + 'associations/proxy'
|
46
|
+
require dir + 'associations/many_documents_proxy'
|
47
|
+
|
48
|
+
require dir + 'associations/belongs_to_proxy'
|
49
|
+
require dir + 'associations/belongs_to_polymorphic_proxy'
|
46
50
|
require dir + 'associations/many_proxy'
|
51
|
+
require dir + 'associations/many_polymorphic_proxy'
|
47
52
|
require dir + 'associations/many_embedded_proxy'
|
48
53
|
require dir + 'associations/many_embedded_polymorphic_proxy'
|
49
|
-
|
50
|
-
require dir + 'associations/belongs_to_polymorphic_proxy'
|
54
|
+
|
51
55
|
require dir + 'callbacks'
|
52
56
|
require dir + 'finder_options'
|
53
57
|
require dir + 'key'
|
54
58
|
require dir + 'observing'
|
55
59
|
require dir + 'pagination'
|
56
|
-
require dir + 'rails_compatibility/document'
|
57
|
-
require dir + 'rails_compatibility/embedded_document'
|
58
60
|
require dir + 'save_with_validation'
|
59
61
|
require dir + 'serialization'
|
60
62
|
require dir + 'validations'
|
61
63
|
|
64
|
+
require dir + 'rails_compatibility/document'
|
65
|
+
require dir + 'rails_compatibility/embedded_document'
|
66
|
+
|
62
67
|
require dir + 'embedded_document'
|
63
68
|
require dir + 'document'
|
64
69
|
|
65
|
-
module MongoMapper
|
66
|
-
|
67
|
-
|
70
|
+
module MongoMapper
|
71
|
+
DocumentNotFound = Class.new(StandardError)
|
72
|
+
IllegalID = Class.new(StandardError)
|
73
|
+
|
74
|
+
DocumentNotValid = Class.new(StandardError) do
|
68
75
|
def initialize(document)
|
69
76
|
@document = document
|
70
77
|
super("Validation failed: #{@document.errors.full_messages.join(", ")}")
|
data/mongomapper.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{mongomapper}
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["John Nunemaker"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-08-06}
|
10
10
|
s.default_executable = %q{mmconsole}
|
11
11
|
s.email = %q{nunemaker@gmail.com}
|
12
12
|
s.executables = ["mmconsole"]
|
@@ -24,12 +24,13 @@ Gem::Specification.new do |s|
|
|
24
24
|
"bin/mmconsole",
|
25
25
|
"lib/mongomapper.rb",
|
26
26
|
"lib/mongomapper/associations.rb",
|
27
|
-
"lib/mongomapper/associations/array_proxy.rb",
|
28
27
|
"lib/mongomapper/associations/base.rb",
|
29
28
|
"lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb",
|
30
29
|
"lib/mongomapper/associations/belongs_to_proxy.rb",
|
30
|
+
"lib/mongomapper/associations/many_documents_proxy.rb",
|
31
31
|
"lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb",
|
32
32
|
"lib/mongomapper/associations/many_embedded_proxy.rb",
|
33
|
+
"lib/mongomapper/associations/many_polymorphic_proxy.rb",
|
33
34
|
"lib/mongomapper/associations/many_proxy.rb",
|
34
35
|
"lib/mongomapper/associations/proxy.rb",
|
35
36
|
"lib/mongomapper/callbacks.rb",
|
@@ -47,6 +48,12 @@ Gem::Specification.new do |s|
|
|
47
48
|
"lib/mongomapper/validations.rb",
|
48
49
|
"mongomapper.gemspec",
|
49
50
|
"test/NOTE_ON_TESTING",
|
51
|
+
"test/functional/associations/test_belongs_to_polymorphic_proxy.rb",
|
52
|
+
"test/functional/associations/test_belongs_to_proxy.rb",
|
53
|
+
"test/functional/associations/test_many_embedded_polymorphic_proxy.rb",
|
54
|
+
"test/functional/associations/test_many_embedded_proxy.rb",
|
55
|
+
"test/functional/associations/test_many_polymorphic_proxy.rb",
|
56
|
+
"test/functional/associations/test_many_proxy.rb",
|
50
57
|
"test/functional/test_associations.rb",
|
51
58
|
"test/functional/test_callbacks.rb",
|
52
59
|
"test/functional/test_document.rb",
|
@@ -77,7 +84,13 @@ Gem::Specification.new do |s|
|
|
77
84
|
s.rubygems_version = %q{1.3.1}
|
78
85
|
s.summary = %q{Awesome gem for modeling your domain and storing it in mongo}
|
79
86
|
s.test_files = [
|
80
|
-
"test/functional/
|
87
|
+
"test/functional/associations/test_belongs_to_polymorphic_proxy.rb",
|
88
|
+
"test/functional/associations/test_belongs_to_proxy.rb",
|
89
|
+
"test/functional/associations/test_many_embedded_polymorphic_proxy.rb",
|
90
|
+
"test/functional/associations/test_many_embedded_proxy.rb",
|
91
|
+
"test/functional/associations/test_many_polymorphic_proxy.rb",
|
92
|
+
"test/functional/associations/test_many_proxy.rb",
|
93
|
+
"test/functional/test_associations.rb",
|
81
94
|
"test/functional/test_callbacks.rb",
|
82
95
|
"test/functional/test_document.rb",
|
83
96
|
"test/functional/test_pagination.rb",
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'models'
|
3
|
+
|
4
|
+
class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
clear_all_collections
|
7
|
+
end
|
8
|
+
|
9
|
+
should "default to nil" do
|
10
|
+
status = Status.new
|
11
|
+
status.target.should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be able to replace the association" do
|
15
|
+
status = Status.new
|
16
|
+
project = Project.new(:name => "mongomapper")
|
17
|
+
status.target = project
|
18
|
+
status.save.should be_true
|
19
|
+
|
20
|
+
from_db = Status.find(status.id)
|
21
|
+
from_db.target.should_not be_nil
|
22
|
+
from_db.target_id.should == project.id
|
23
|
+
from_db.target_type.should == "Project"
|
24
|
+
from_db.target.name.should == "mongomapper"
|
25
|
+
end
|
26
|
+
|
27
|
+
should "unset the association" do
|
28
|
+
status = Status.new
|
29
|
+
project = Project.new(:name => "mongomapper")
|
30
|
+
status.target = project
|
31
|
+
status.save.should be_true
|
32
|
+
|
33
|
+
from_db = Status.find(status.id)
|
34
|
+
from_db.target = nil
|
35
|
+
from_db.target_type.should be_nil
|
36
|
+
from_db.target_id.should be_nil
|
37
|
+
from_db.target.should be_nil
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'models'
|
3
|
+
|
4
|
+
class BelongsToProxyTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
clear_all_collections
|
7
|
+
end
|
8
|
+
|
9
|
+
should "default to nil" do
|
10
|
+
status = Status.new
|
11
|
+
status.project.should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be able to replace the association" do
|
15
|
+
status = Status.new
|
16
|
+
project = Project.new(:name => "mongomapper")
|
17
|
+
status.project = project
|
18
|
+
status.save.should be_true
|
19
|
+
|
20
|
+
from_db = Status.find(status.id)
|
21
|
+
from_db.project.should_not be_nil
|
22
|
+
from_db.project.name.should == "mongomapper"
|
23
|
+
end
|
24
|
+
|
25
|
+
should "unset the association" do
|
26
|
+
status = Status.new
|
27
|
+
project = Project.new(:name => "mongomapper")
|
28
|
+
status.project = project
|
29
|
+
status.save.should be_true
|
30
|
+
|
31
|
+
from_db = Status.find(status.id)
|
32
|
+
from_db.project = nil
|
33
|
+
from_db.project.should be_nil
|
34
|
+
end
|
35
|
+
end
|