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:
コメント