« ビデオにも広告 | トップページ | ネットと歴史学 »

2008年2月24日 (日)

AcriveRecordをさわってみる その3

一対一をやったからには、一対多もやらないとな。
というわけで今回は一対多をやってみます。

まずは、前回のcommentsテーブルにレコードを追加します。
---
> sqlite3 data.db
sqlite> insert into comments values(null, 1, "How are you?");
sqlite> .quit
---

article_idカラムが1のデータを追加したので、articlesテーブルのid=1の記事は2つ目のコメントを持つことになりました。

このデータを参照するコードは以下のとおり。
前回のar3.rbのちょこっと改造版です。
ar4.rb
===
#!/usr/bin/ruby

require 'rubygems'
require 'active_record'

#DB接続
ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :database => 'data.db'
)

# articlesテーブル
class Article < ActiveRecord::Base
  has_many :comments
end

# authorsテーブル
class Comment < ActiveRecord::Base
  belongs_to :article
end

#記事とコメントを全て表示
Article.find(:all).each{ |article|
  article.comments.find(:all).each{ |comment|
    if !comment.nil?
      p "#{comment.article.article}|#{comment.comment}"
    end
  }

}

puts '---'

#Commentクラスで全て表示
Comment.find(:all).each{ |comment|
  p "#{comment.article.article}|#{comment.comment}"
}

===

ar3.rbと異なる部分を赤字で記載しています。
データの検索はArticleクラス、Commentクラスで2回行っています。
実行すると、
---
>ruby ar4.rb
"Hello World!|Nice to meet you"
"Hello World!|How are you?"
"Konnichiha Sekai!|Hajime mashite!"
---
"Hello World!|Nice to meet you"
"Konnichiha Sekai!|Hajime mashite!"
"Hello World!|How are you?"
---

データは同じですが、順番が違いますね。

Articleクラスにhas_manyを定義することで、一対多を実現しています。シンボルが複数形になっていることに注意してください。

このように、規約を守っていればとても簡単にデータ問合せができます。
長ったらしいSQL文を書かなくていいだけでもActiveRecordは便利に思えます。
個人的にはコードの一行が短くなるのがうれしいですね。

|

« ビデオにも広告 | トップページ | ネットと歴史学 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/125677/10734861

この記事へのトラックバック一覧です: AcriveRecordをさわってみる その3:

« ビデオにも広告 | トップページ | ネットと歴史学 »