Ruby on Rails
BasicRelationalのチュートリアル

« チュートリアルステップ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に戻る

カテゴリ:チュートリアル