« そろそろやっとホウレンソウ | トップページ | OpenIDファウンデーション・ジャパン設立へ »

2008年2月27日 (水)

AcriveRecordをさわってみる その4

一対多をやったからには多対多。ということで。

ActiveRecordで簡単に多対多を実現するには、関連付けるテーブルのIDのみからなるコントロールテーブルを間に入れます。

ためしに前回のarticlesの記事にカテゴリを関連付けてみましょう。記事はカテゴリを複数持ち、カテゴリは複数の記事を持つ。多対多の関係です。

データベースにcategoriesテーブルとassignsコントロールテーブルを追加します。
---
> sqlite3 data.db
sqlite> create table categories(id integer primary key, name string);
sqlite> create table assigns(article_id integer, category_id integer);
sqlite> insert into categories values(null, "economy");
sqlite> insert into categories values(null, "government");
sqlite> insert into categories values(null, "computer");
sqlite> insert into assigns values(1, 1);
sqlite> insert into assigns values(1, 2);
sqlite> insert into assigns values(2, 3);
sqlite> insert into assigns values(1, 3);
sqlite> insert into assigns values(3, 3);
sqlite> .quit
---

assingsテーブルのデータで記事とカテゴリのIDを関連付けています。

これを表示するスクリプトは以下のとおり。
ar5.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_and_belongs_to_many :categories, :join_table => 'assigns'
end

# authorsテーブル
class Category < ActiveRecord::Base
  has_and_belongs_to_many :articles, :join_table => 'assigns'
end

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

前回のar4.rbと違う部分を赤字で記載しています。
実行すると以下のようになります。
---
>ruby ar5.rb
"Hello World!|economy"
"Hello World!|government"
"Hello World!|computer"
"Konnichiha Sekai!|computer"
"Hello Ruby ActiveRecord!|computer"
---

以上のように、多対多の関係も非常に簡潔に記述できます。
最初に書いたように、ActiveRecordにある程度親しんでからRailsを学ぶと開発もスムーズにはいれるかもしれません。

|

トラックバック

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

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

コメント

コメントを書く