jchris-couchrest 0.9.10 → 0.9.11
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/examples/model/example.rb +138 -0
- data/lib/couchrest/core/model.rb +4 -5
- data/spec/couchrest/core/model_spec.rb +2 -2
- metadata +1 -1
data/Rakefile
CHANGED
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'couchrest'
|
3
|
+
|
4
|
+
def show obj
|
5
|
+
puts obj.inspect
|
6
|
+
puts
|
7
|
+
end
|
8
|
+
|
9
|
+
CouchRest::Model.default_database = CouchRest.database!('couchrest-model-example')
|
10
|
+
|
11
|
+
class Author < CouchRest::Model
|
12
|
+
key_accessor :name
|
13
|
+
def drink_scotch
|
14
|
+
puts "... glug type glug ... I'm #{name} ... type glug glug ..."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Post < CouchRest::Model
|
19
|
+
key_accessor :title, :body, :author
|
20
|
+
|
21
|
+
cast :author, :as => 'Author'
|
22
|
+
|
23
|
+
timestamps!
|
24
|
+
end
|
25
|
+
|
26
|
+
class Comment < CouchRest::Model
|
27
|
+
cast :commenter, :as => 'Author'
|
28
|
+
|
29
|
+
def post= post
|
30
|
+
self["post_id"] = post.id
|
31
|
+
end
|
32
|
+
def post
|
33
|
+
Post.get(self['post_id']) if self['post_id']
|
34
|
+
end
|
35
|
+
|
36
|
+
timestamps!
|
37
|
+
end
|
38
|
+
|
39
|
+
puts "Act I: CRUD"
|
40
|
+
puts
|
41
|
+
puts "(pause for dramatic effect)"
|
42
|
+
puts
|
43
|
+
sleep 2
|
44
|
+
|
45
|
+
puts "Create an author."
|
46
|
+
quentin = Author.new("name" => "Quentin Hazel")
|
47
|
+
show quentin
|
48
|
+
|
49
|
+
puts "Create a new post."
|
50
|
+
post = Post.new(:title => "First Post", :body => "Lorem ipsum dolor sit amet, consectetur adipisicing elit...")
|
51
|
+
show post
|
52
|
+
|
53
|
+
puts "Add the author to the post."
|
54
|
+
post.author = quentin
|
55
|
+
show post
|
56
|
+
|
57
|
+
puts "Save the post."
|
58
|
+
post.save
|
59
|
+
show post
|
60
|
+
|
61
|
+
puts "Load the post."
|
62
|
+
reloaded = Post.get(post.id)
|
63
|
+
show reloaded
|
64
|
+
|
65
|
+
puts "The author of the post is an instance of Author."
|
66
|
+
reloaded.author.drink_scotch
|
67
|
+
|
68
|
+
puts "\nAdd some comments to the post."
|
69
|
+
comment_one = Comment.new :text => "Blah blah blah", :commenter => {:name => "Joe Sixpack"}
|
70
|
+
comment_two = Comment.new :text => "Yeah yeah yeah", :commenter => {:name => "Jane Doe"}
|
71
|
+
comment_three = Comment.new :text => "Whatever...", :commenter => {:name => "John Stewart"}
|
72
|
+
|
73
|
+
# TODO - maybe add some magic here?
|
74
|
+
comment_one.post = post
|
75
|
+
comment_two.post = post
|
76
|
+
comment_three.post = post
|
77
|
+
comment_one.save
|
78
|
+
comment_two.save
|
79
|
+
comment_three.save
|
80
|
+
|
81
|
+
show comment_one
|
82
|
+
show comment_two
|
83
|
+
show comment_three
|
84
|
+
|
85
|
+
puts "We can load a post through its comment (no magic here)."
|
86
|
+
show post = comment_one.post
|
87
|
+
|
88
|
+
puts "Commenters are also authors."
|
89
|
+
comment_two['commenter'].drink_scotch
|
90
|
+
comment_one['commenter'].drink_scotch
|
91
|
+
comment_three['commenter'].drink_scotch
|
92
|
+
|
93
|
+
puts "\nLet's save an author to her own document."
|
94
|
+
jane = comment_two['commenter']
|
95
|
+
jane.save
|
96
|
+
show jane
|
97
|
+
|
98
|
+
puts "Oh, that's neat! Because Ruby passes hash valuee by reference, Jane's new id has been added to the comment she left."
|
99
|
+
show comment_two
|
100
|
+
|
101
|
+
puts "Of course, we'd better remember to save it."
|
102
|
+
comment_two.save
|
103
|
+
show comment_two
|
104
|
+
|
105
|
+
puts "Oooh, denormalized... feel the burn!"
|
106
|
+
puts
|
107
|
+
puts
|
108
|
+
puts
|
109
|
+
puts "Act II: Views"
|
110
|
+
puts
|
111
|
+
puts
|
112
|
+
sleep 2
|
113
|
+
|
114
|
+
puts "Let's find all the comments that go with our post."
|
115
|
+
puts "Our post has id #{post.id}, so lets find all the comments with that post_id."
|
116
|
+
puts
|
117
|
+
|
118
|
+
class Comment
|
119
|
+
view_by :post_id
|
120
|
+
end
|
121
|
+
|
122
|
+
comments = Comment.by_post_id :key => post.id
|
123
|
+
show comments
|
124
|
+
|
125
|
+
puts "That was too easy."
|
126
|
+
puts "We can even wrap it up in a finder on the Post class."
|
127
|
+
puts
|
128
|
+
|
129
|
+
class Post
|
130
|
+
def comments
|
131
|
+
Comment.by_post_id :key => id
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
show post.comments
|
136
|
+
puts "Gimme 5 minutes and I'll roll this into the framework. ;)"
|
137
|
+
puts
|
138
|
+
puts "There is a lot more that can be done with views, but a lot of the interesting stuff is joins, which of course range across types. We'll pick up where we left off, next time."
|
data/lib/couchrest/core/model.rb
CHANGED
@@ -450,14 +450,13 @@ module CouchRest
|
|
450
450
|
self.class.casts.each do |k,v|
|
451
451
|
next unless self[k]
|
452
452
|
target = v[:as]
|
453
|
-
if target.is_a?(Array)
|
453
|
+
if target.is_a?(Array)
|
454
|
+
klass = ::Extlib::Inflection.constantize(target[0])
|
454
455
|
self[k] = self[k].collect do |value|
|
455
|
-
|
456
|
+
klass.new(value)
|
456
457
|
end
|
457
|
-
elsif target.is_a?(Class)
|
458
|
-
self[k] = target.new(self[k])
|
459
458
|
else
|
460
|
-
|
459
|
+
self[k] = ::Extlib::Inflection.constantize(target).new(self[k])
|
461
460
|
end
|
462
461
|
end
|
463
462
|
end
|