mongo_odm 0.2.6 → 0.2.7
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/CONTRIBUTORS +3 -2
- data/Gemfile.lock +0 -21
- data/README.rdoc +86 -1
- data/lib/mongo_odm.rb +4 -0
- data/lib/mongo_odm/core_ext/conversions.rb +29 -0
- data/lib/mongo_odm/document/persistence.rb +4 -0
- data/lib/mongo_odm/version.rb +1 -1
- metadata +1 -1
data/CONTRIBUTORS
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
ZenTest (4.4.2)
|
5
4
|
activemodel (3.0.4)
|
6
5
|
activesupport (= 3.0.4)
|
7
6
|
builder (~> 2.1.2)
|
8
7
|
i18n (~> 0.4)
|
9
8
|
activesupport (3.0.4)
|
10
|
-
archive-tar-minitar (0.5.2)
|
11
|
-
autotest (4.4.6)
|
12
|
-
ZenTest (>= 4.4.1)
|
13
9
|
bson (1.2.2)
|
14
10
|
bson_ext (1.2.2)
|
15
11
|
builder (2.1.2)
|
16
|
-
columnize (0.3.2)
|
17
|
-
database_cleaner (0.6.3)
|
18
12
|
diff-lcs (1.1.2)
|
19
13
|
git (1.2.5)
|
20
14
|
i18n (0.5.0)
|
@@ -22,8 +16,6 @@ GEM
|
|
22
16
|
bundler (~> 1.0.0)
|
23
17
|
git (>= 1.2.5)
|
24
18
|
rake
|
25
|
-
linecache19 (0.5.11)
|
26
|
-
ruby_core_source (>= 0.1.4)
|
27
19
|
mongo (1.2.2)
|
28
20
|
bson (>= 1.2.2)
|
29
21
|
rake (0.8.7)
|
@@ -36,16 +28,6 @@ GEM
|
|
36
28
|
rspec-expectations (2.4.0)
|
37
29
|
diff-lcs (~> 1.1.2)
|
38
30
|
rspec-mocks (2.4.0)
|
39
|
-
ruby-debug-base19 (0.11.24)
|
40
|
-
columnize (>= 0.3.1)
|
41
|
-
linecache19 (>= 0.5.11)
|
42
|
-
ruby_core_source (>= 0.1.4)
|
43
|
-
ruby-debug19 (0.11.6)
|
44
|
-
columnize (>= 0.3.1)
|
45
|
-
linecache19 (>= 0.5.11)
|
46
|
-
ruby-debug-base19 (>= 0.11.19)
|
47
|
-
ruby_core_source (0.1.4)
|
48
|
-
archive-tar-minitar (>= 0.5.2)
|
49
31
|
tzinfo (0.3.24)
|
50
32
|
watchr (0.7)
|
51
33
|
yard (0.6.4)
|
@@ -56,14 +38,11 @@ PLATFORMS
|
|
56
38
|
DEPENDENCIES
|
57
39
|
activemodel (~> 3.0.4)
|
58
40
|
activesupport (~> 3.0.4)
|
59
|
-
autotest
|
60
41
|
bson_ext (~> 1.2.2)
|
61
|
-
database_cleaner
|
62
42
|
jeweler (~> 1.5.2)
|
63
43
|
mongo (~> 1.2.2)
|
64
44
|
rcov (~> 0.9.9)
|
65
45
|
rspec (= 2.4.0)
|
66
|
-
ruby-debug19
|
67
46
|
tzinfo (~> 0.3.24)
|
68
47
|
watchr (~> 0.7)
|
69
48
|
yard (~> 0.6.4)
|
data/README.rdoc
CHANGED
@@ -105,6 +105,33 @@ Alternatively, you can pass a MongoODM::Collection instance to set_collection, t
|
|
105
105
|
set_collection MongoODM::Collection.new(MongoODM.connection.db('another_database'), 'my_shapes')
|
106
106
|
end
|
107
107
|
|
108
|
+
= References
|
109
|
+
|
110
|
+
You can use BSON::DBRef as the type of a field. This acts as a pointer to any other document in your database, at any collection. If you assign a MongoODM::Document instance to a BSON::DBRef field, it will be converted to a reference automatically. To instantiate any reference object, just call "dereference" on it. To convert any MongoODM::Document object to a reference, just call "to_dbref" on it.
|
111
|
+
|
112
|
+
You can even dereference a full array or hash that contains BSON::DBRef instances! It will dereference them at any level.
|
113
|
+
|
114
|
+
class Node
|
115
|
+
include MongoODM::Document
|
116
|
+
field :name
|
117
|
+
field :parent, BSON::DBRef
|
118
|
+
field :children, Array
|
119
|
+
end
|
120
|
+
|
121
|
+
root_node = Node.new(:name => 'root')
|
122
|
+
root_node.save
|
123
|
+
children1 = Node.new(:name => 'children1', :parent => root_node)
|
124
|
+
children1.save
|
125
|
+
root_node.children = [children1.to_dbref]
|
126
|
+
root_node.save
|
127
|
+
|
128
|
+
children1.parent # Returns BSON::DBRef(namespace:"nodes", id: "4d60e8c83f5f19cf08000001")
|
129
|
+
root_node.children # Returns [BSON::DBRef(namespace:"nodes", id: "4d60e8c83f5f19cf08000002")]
|
130
|
+
|
131
|
+
children1.parent.dereference # Returns #<Node _id: BSON::ObjectId('4d60e8c83f5f19cf08000001'), children: [BSON::DBRef(namespace:"nodes", id: "4d60e8c83f5f19cf08000002")], name: "root", parent: nil>
|
132
|
+
|
133
|
+
root_node.children.dereference # Returns [#<Node _id: BSON::ObjectId('4d60e8c83f5f19cf08000002'), children: nil, name: "children1", parent: BSON::DBRef(namespace:"nodes", id: "4d60e8c83f5f19cf08000001")>]
|
134
|
+
|
108
135
|
= Associations
|
109
136
|
|
110
137
|
To embed just one copy of another class, just define the field type of that class. The class just need to respond to the "type_cast" class method and the "to_mongo" instance method. Example:
|
@@ -234,7 +261,65 @@ If you want to save a collection of objects, just define the field as an Array.
|
|
234
261
|
# #<Draw objects: [#<Circle x: 1.0, y: 1.0, color: nil, radius: 10.0>, #<Line x: 0.0, y: 0.0, color: nil, dx: 10.0, dy: 5.0>, #<Circle x: 2.0, y: 2.0, color: nil, radius: 20.0>], _id: {"$oid"=>"4bf0775d715dd2725a000001"}>
|
235
262
|
|
236
263
|
|
237
|
-
To reference the associated objects instead of embed them,
|
264
|
+
To reference the associated objects instead of embed them, you can use BSON::DBRef (to reference one), Array (to reference several), and others:
|
265
|
+
|
266
|
+
class Flag
|
267
|
+
include MongoODM::Document
|
268
|
+
field :colors_refs, Array, :default => []
|
269
|
+
|
270
|
+
def add_color(color)
|
271
|
+
colors_refs << color.to_dbref
|
272
|
+
end
|
273
|
+
|
274
|
+
def colors
|
275
|
+
colors_refs.dereference
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
class Color
|
280
|
+
include MongoODM::Document
|
281
|
+
field :name
|
282
|
+
end
|
283
|
+
|
284
|
+
color_red = Color.new(:name => "red")
|
285
|
+
color_red.save
|
286
|
+
color_green = Color.new(:name => "green")
|
287
|
+
color_green.save
|
288
|
+
|
289
|
+
flag = Flag.new
|
290
|
+
flag.add_color(color_red)
|
291
|
+
flag.add_color(color_green)
|
292
|
+
flag.save
|
293
|
+
|
294
|
+
# Saves:
|
295
|
+
# { "_id" : ObjectId("4be96c15715dd2c4be000003"),
|
296
|
+
# "_class" : "Flag",
|
297
|
+
# "colors_refs" : [
|
298
|
+
# { "$ns" : "colors",
|
299
|
+
# "$id" : {
|
300
|
+
# "$oid" : "4d60ea4e3f5f19cf10000001"
|
301
|
+
# }
|
302
|
+
# },
|
303
|
+
# { "$ns" : "colors",
|
304
|
+
# "$id" : {
|
305
|
+
# "$oid" : "4d60ea4e3f5f19cf10000002"
|
306
|
+
# }
|
307
|
+
# }
|
308
|
+
# ]
|
309
|
+
# }
|
310
|
+
|
311
|
+
flag.colors # Returns [#<Color _id: BSON::ObjectId('4d60ea4e3f5f19cf10000001'), name: "red">, #<Color _id: BSON::ObjectId('4d60ea4e3f5f19cf10000002'), name: "green">]
|
312
|
+
|
313
|
+
flag.colors
|
314
|
+
|
315
|
+
# Returns a criteria object that wraps a cursor
|
316
|
+
|
317
|
+
flag.colors.to_a
|
318
|
+
|
319
|
+
# Returns:
|
320
|
+
# [#<Color name: "red", _id: {"$oid"=>"4be96bfe715dd2c4be000001"}>, #<Color name: "green", _id: {"$oid"=>"4be96c08715dd2c4be000002"}>]
|
321
|
+
|
322
|
+
Or you can build your custon methods. Example:
|
238
323
|
|
239
324
|
class Flag
|
240
325
|
include MongoODM::Document
|
data/lib/mongo_odm.rb
CHANGED
@@ -26,6 +26,27 @@ class BSON::ObjectId
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
# @private
|
30
|
+
class BSON::DBRef
|
31
|
+
def self.type_cast(value)
|
32
|
+
return value if value.is_a?(BSON::DBRef)
|
33
|
+
return value.to_dbref if value.respond_to?(:to_dbref)
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_mongo
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def dereference
|
42
|
+
MongoODM.instanciate(MongoODM.database.dereference(self))
|
43
|
+
end
|
44
|
+
|
45
|
+
def inspect
|
46
|
+
"BSON::DBRef(namespace:\"#{namespace}\", id: \"#{object_id}\")"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
29
50
|
# @private
|
30
51
|
class Array
|
31
52
|
def self.type_cast(value)
|
@@ -36,6 +57,10 @@ class Array
|
|
36
57
|
def to_mongo
|
37
58
|
self.map {|elem| elem.to_mongo}
|
38
59
|
end
|
60
|
+
|
61
|
+
def dereference
|
62
|
+
MongoODM.instanciate(self.map{|value| MongoODM.dereference(value)})
|
63
|
+
end
|
39
64
|
end
|
40
65
|
|
41
66
|
# @private
|
@@ -219,6 +244,10 @@ class Hash
|
|
219
244
|
def to_mongo
|
220
245
|
Hash[self.map{|k,v| [k.to_mongo, v.to_mongo]}]
|
221
246
|
end
|
247
|
+
|
248
|
+
def dereference
|
249
|
+
Hash[self.map{|k,v| [MongoODM.instanciate(MongoODM.dereference(k)), MongoODM.instanciate(MongoODM.dereference(v))]}]
|
250
|
+
end
|
222
251
|
end
|
223
252
|
|
224
253
|
# @private
|
data/lib/mongo_odm/version.rb
CHANGED