« チュートリアルステップ6 | チュートリアル | Scaffoldingのチュートリアル »
これまでは、単一のテーブルへのアクセス方法を見てきましたが、もっと複雑な関係ではどうなるのでしょうか?例の中の電話番号はどうなのでしょうか?
携帯電話が珍しいものから必需品に変化したので、ほとんどの人が複数の電話番号を持っています。(読者が関係データベースの設計を良く知っていることを想定しています… もしそうでなければ、急いで別の場所で勉強してください!)
データベースに別のテーブルを追加しましょう
mysqlを使っているなら、以下のSQL文を実行してください:
CREATE TABLE `phones` ( `id` int(10) unsigned NOT NULL auto_increment, `person_id` int(10) unsigned NOT NULL default '0', `phone` varchar(15) NOT NULL default '', PRIMARY KEY (`id`), KEY `people_id` (`person_id`), KEY `phone` (`phone`) ) TYPE=MyISAM; INSERT INTO `phones` VALUES (1, 1, '1234567890'); INSERT INTO `phones` VALUES (2, 1, '1122334455');
postgresqlの場合:
CREATE TABLE phones ( id serial PRIMARY KEY, person_id int NOT NULL, phone text, FOREIGN KEY (person_id) REFERENCES people ON DELETE CASCADE); INSERT INTO phones (person_id, phone) VALUES (1, '1234567890'); INSERT INTO phones (person_id, phone) VALUES (1, '1122334455');
SQLiteの場合:
CREATE TABLE phones ( id INTEGER PRIMARY KEY, person_id INTEGER NOT NULL, phone TEXT, FOREIGN KEY (person_id) REFERENCES people ON DELETE CASCADE ); INSERT INTO phones (person_id, phone) VALUES(1, '1234567890'); INSERT INTO phones (person_id, phone) VALUES(1, '1122334455');
注意すべき重要なセマンティクス: 初期設定では外部キーは外部テーブルの名前に_id
を追加したものです。たとえばperson_id
です。モデル名は単数形であるにもかかわらず、テーブル名は複数形であることにも注意してください。今度はモデルを定義しましょう:
./script/generate model Phone
新しいファイルphone.rb
がモデルディレクトリに生成されますが、この段階では修正する必要はありません。しかしながら、person.rb
ファイルの以下のような場所に一行追加してください:
class Person < ActiveRecord::Base has_many :phones end
has_manyを呼ぶことによって、ActiveRecordは、その関係にについて知りました。それをページ上に表示するのは簡単です。
“view
”ビューの中のどこかに以下の行を追加してください:
<% for phone in @person.phones %> <%= phone.phone %><br/> <% end %>
これで、このPersonに複数の電話番号を持たせられました。
Scaffoldingのチュートリアルに進む | チュートリアルl | チュートリアルステップ6に戻る
カテゴリ:チュートリアル