This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Using Object Relational Mapping with Og (written by Mauro Cicio) | ||
|---|---|---|
| Code | Expected | Actual |
require 'cookbook_dbconnect' require 'og' class BlogPost property :title, :content, String end class Comment property :author, :content, String belongs_to :blog_post, BlogPost end |
Now that Comment's been defined, add a reference to it in BlogPost. |
|
class BlogPost has_many :comments, Comment end og_connect |
Og uses the Mysql store. Created table 'ogcomment'. Created table 'ogblogpost'. |
|
post = BlogPost.new
post.title = "First post"
post.content = "Here are some pictures of our iguana."
post.save!
[["Alice", "That's one cute iguana!"],
["Bob", "Thank you, Alice!"]].each do |author, content|
comment = Comment.new
comment.blog_post = post
comment.author = author
comment.content = content
comment.save!
end
post = BlogPost.first
puts %{#{post.comments.size} comments for "#{post.title}"} |
2 comments for "First post" |
2 comments for "First post" |
post.comments.each do |comment|
puts "Comment author: #{comment.author}"
puts "Comment: #{comment.content}"
end |
Comment author: Alice Comment: That's one cute iguana! Comment author: Bob Comment: Thank you, Alice! |
Comment author: Alice Comment: That's one cute iguana! Comment author: Bob Comment: Thank you, Alice! |
puts %{The first comment was made on "#{Comment.first.blog_post.title}"} |
The first comment was made on "First post" |
Error! (Exception?) Here's stdout: NoMethodError: undefined method `title' for nil:NilClass from (irb):32 from :0 |
class Person property :name, String many_to_many :posts, BlogPost end class BlogPost many_to_many :authors, Person end og_connect |
Retroactively make Bob and Carol the collaborative authors of our first blog post. |
|
['Bob', 'Carol'].each do |name|
p = Person.new
p.name = name
p.save
end
Person.find_by_name('Bob').add_post(post)
Person.find_by_name('Carol').add_post(post)
author = Person.first
puts "#{author.name} has made #{author.posts.size} blog post(s)." |
Bob has made 1 blog post(s). |
Bob has made 1 blog post(s). |
puts %{The blog post "#{post.title}" has #{post.authors.size} author(s).} |
The blog post "First post" has 2 author(s). |
Error! (Exception?) Here's stdout: NoMethodError: undefined method `authors' for #<BlogPost:0xb7977828> from (irb):50 from (eval):3 |
author.add_post(BlogPost.create_with({
:title => 'Second post',
:content => 'We have some cats as well.'
} ))
author.posts.each do |post|
puts %{#{author.name}'s blog post "#{post.title}" has #{post.comments.size} comments.}
end |
Bob's blog post "First post" has 2 comments. Bob's blog post "Second post" has 0 comments. |
Bob's blog post "First post" has 2 comments. Bob's blog post "Second post" has 0 comments. |
BlogPost.first.delete BlogPost.first.delete(false) |
nil | |