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 |