mongo_odm 0.2.2 → 0.2.3
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.rdoc +72 -2
- data/lib/mongo_odm/criteria.rb +21 -6
- data/lib/mongo_odm/document/persistence.rb +1 -1
- data/lib/mongo_odm/version.rb +1 -1
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -51,8 +51,9 @@ A piece of code is better than a hundred of words:
|
|
51
51
|
# "color" : null,
|
52
52
|
# "radius" : 1 }
|
53
53
|
|
54
|
-
all_shapes = Shape.find.
|
55
|
-
|
54
|
+
all_shapes = Shape.find # Returns a criteria object. It will execute the query and instance the objects once you iterate over it
|
55
|
+
|
56
|
+
all_shapes.to_a
|
56
57
|
# Returns all the shapes; notice they are of different classes:
|
57
58
|
# [ #<Shape x: 0.0, y: 5.0, color: nil, name: "Point", _id: {"$oid"=>"4be97178715dd2c4be000006"}>,
|
58
59
|
# #<Circle x: 1.0, y: 1.0, color: nil, radius: 1.0, _id: {"$oid"=>"4be97293715dd2c4be000008"}> ]
|
@@ -65,6 +66,28 @@ to have the attribute "_class" set to the name of the class you want to use as t
|
|
65
66
|
# Returns:
|
66
67
|
# #<Circle x: 12.0, y: 5.0, color: nil, radius: 1.0>
|
67
68
|
|
69
|
+
And because any query method returns a MongoODM::Criteria object, you can concatenate them to nest several conditions (like if they were ActiveRecord scopes):
|
70
|
+
|
71
|
+
Shape.find(:radius => 1).find({}, {:sort => [:color, :asc]}) # Returns a criteria object. Once you iterate over it, it will run a query with both the :radius selector and :sort order.
|
72
|
+
|
73
|
+
You can also define your own class methods that returns criteria objects, and concatenate them to obtain a single criteria with all the conditions merged in the calls order:
|
74
|
+
|
75
|
+
class Shape
|
76
|
+
def self.with_radius(n)
|
77
|
+
find(:radius => n)
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.ordered_by_color
|
81
|
+
find({}, {:sort => [:color, :asc]})
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
Shape.with_radius(1).ordered_by_color # Returns the same criteria than the previous example
|
86
|
+
|
87
|
+
Take a look at the Mongo Ruby driver documentation for the 'find' method to see the available options:
|
88
|
+
|
89
|
+
http://api.mongodb.org/ruby/1.0.8/Mongo/Collection.html#find-instance_method
|
90
|
+
|
68
91
|
= Associations
|
69
92
|
|
70
93
|
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:
|
@@ -235,21 +258,68 @@ To reference the associated objects instead of embed them, for now you need to d
|
|
235
258
|
|
236
259
|
For now, the available callbacks are: after_initialize, before_save, after_save
|
237
260
|
|
261
|
+
Example:
|
262
|
+
|
263
|
+
class User
|
264
|
+
include MongoODM::Document
|
265
|
+
|
266
|
+
field :encrypted_password
|
267
|
+
attr_accessor :password
|
268
|
+
|
269
|
+
before_save :encrypt_password
|
270
|
+
|
271
|
+
def encrypt_password
|
272
|
+
return if self.password.blank?
|
273
|
+
self.encrypted_password = encrypt(password)
|
274
|
+
end
|
275
|
+
protected :encrypt_password
|
276
|
+
end
|
277
|
+
|
238
278
|
= Validations
|
239
279
|
|
240
280
|
All the validation methods defined in ActiveModel::Validations are included
|
241
281
|
|
282
|
+
Example:
|
283
|
+
|
284
|
+
class User
|
285
|
+
field :email
|
286
|
+
|
287
|
+
validates_presence_of :email
|
288
|
+
validates_uniqueness_of :email, :case_sensitive => false
|
289
|
+
validates_format_of :email, :with => /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
|
290
|
+
end
|
291
|
+
|
242
292
|
= Dirty
|
243
293
|
|
244
294
|
All the dirty object methods defined in ActiveModel::Dirty are included
|
245
295
|
|
296
|
+
Example:
|
297
|
+
|
298
|
+
class User
|
299
|
+
field :email
|
300
|
+
end
|
301
|
+
|
302
|
+
user = User.new
|
303
|
+
user.email = "hello@h1labs.com"
|
304
|
+
user.email_changed? # Returns true
|
305
|
+
user.email_change # Returns [nil, "hello@h1labs.com"]
|
306
|
+
user.changes # Returns {"email" => [nil, "hello@h1labs.com"]}
|
307
|
+
|
246
308
|
= TODO
|
247
309
|
|
310
|
+
* Support join of different concatenated find calls to a single criteria object
|
248
311
|
* Add helpers to define attributes as referenced objects
|
312
|
+
* Allow to specify different database connections with each document definition
|
249
313
|
* Increase rspec coverage
|
250
314
|
* Document, document, document!
|
251
315
|
* Create useful modules to make common operations easier (versioning, localization, etc)
|
252
316
|
|
317
|
+
= More
|
318
|
+
|
319
|
+
For now, take a look at the Mongo Ruby driver syntax:
|
320
|
+
|
321
|
+
http://api.mongodb.org/ruby/1.0.8/index.html
|
322
|
+
|
253
323
|
= Copyright
|
254
324
|
|
255
325
|
Copyright © 2010 Carlos Paramio. See LICENSE for details.
|
data/lib/mongo_odm/criteria.rb
CHANGED
@@ -2,18 +2,33 @@
|
|
2
2
|
module MongoODM
|
3
3
|
|
4
4
|
class Criteria
|
5
|
-
def initialize(
|
6
|
-
@
|
5
|
+
def initialize(klass, selector = {}, opts = {})
|
6
|
+
@klass, @selector, @opts = klass, selector, opts
|
7
7
|
end
|
8
8
|
|
9
9
|
def find(selector = {}, opts = {})
|
10
|
-
|
11
|
-
@opts.merge!(opts)
|
12
|
-
self
|
10
|
+
_merge_criteria(selector, opts)
|
13
11
|
end
|
14
12
|
|
15
13
|
def method_missing(method_name, *args)
|
16
|
-
|
14
|
+
if @klass.methods.include?(method_name)
|
15
|
+
result = @klass.send(method_name, *args)
|
16
|
+
if result.is_a?(Criteria)
|
17
|
+
selector = result.instance_variable_get("@selector")
|
18
|
+
opts = result.instance_variable_get("@opts")
|
19
|
+
_merge_criteria(selector, opts)
|
20
|
+
else
|
21
|
+
result
|
22
|
+
end
|
23
|
+
else
|
24
|
+
@klass.collection.find(@selector, @opts).send(method_name, *args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def _merge_criteria(selector, opts)
|
29
|
+
@selector.merge!(selector)
|
30
|
+
@opts.merge!(opts)
|
31
|
+
self
|
17
32
|
end
|
18
33
|
end
|
19
34
|
|
data/lib/mongo_odm/version.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 3
|
9
|
+
version: 0.2.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Carlos Paramio
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-30 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|