テーブル間での連携

テーブルとテーブルを結合してみる。

道具には作った人がいるだろうということで、creatorテーブルを追加。
まずは、新しいテーブルをscaffoldでcreateする。

>ruby script/generate scaffold creator name:string

「db/migrate/003_create_creators.rb」が出来上がってるので、

>rake db:migrate

でテーブルを生成。

http://localhost:3000/creators」からデータをちょこちょこ追加してあげると、

Name
smith      Show  Edit  Destroy
herbalist  Show  Edit  Destroy

こんな感じに。
smithは鍛治屋、herbalistは薬草師のこと。

でもって、このcreatorテーブルと、itemテーブルを繋ぐために、
itemテーブルに、creator_idフィールドを追加する。

migrationファイルをgenerateすると、

>ruby script/generate migration AddItemsCreatorID

「db/migrate/004_add_items_creator_id.rb」ができあがるので、

class AddItemsCreatorId < ActiveRecord::Migration
  def self.up
    add_column :items, :creator_id, :integer
  end

  def self.down
    remove_column :items, :creator_id, :integer
  end
end

こんな感じで、itemテーブルにcreator_idフィールドを追加する記述をする。

最後に、

>rake db:migrate

で、DB生成完了。

>sqlite3 db/development.sqlite3

で中身を見てみると、

sqlite> .table
creators     items        schema_info

ちゃんとcreatorsテーブルが生成されていて、

sqlite> .schema
CREATE TABLE creators (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"name" varchar(255) DEFAULT NULL, 
"created_at" datetime DEFAULT NULL, 
"updated_at" datetime DEFAULT NULL
);
CREATE TABLE items (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"name" varchar(255) DEFAULT NULL, 
"price" integer DEFAULT NULL, 
"created_at" datetime DEFAULT NULL, 
"updated_at" datetime DEFAULT NULL, 
"number_of_times" integer, 
"creator_id" integer
);
CREATE TABLE schema_info (version integer);

itemsテーブルには、creator_idも追加されてるのが確認できる。

でもって、テーブルを結合するのに、
「/app/models/creator.rb」に

class Creator < ActiveRecord::Base
  has_many :items
end

「/app/models/item.rb」に

class Item < ActiveRecord::Base
  belongs_to :creator
end

を追記する。
creatorは、itemを複数持つので複数形、itemは、creatorが1つ(1人)だけなので単数形なのに注意。

あとはitemsビューのerbファイルに、creatorのidとnameを表示と修正できるようにちょこちょこっとコード追加。
ひとまずcreator_idはidを手入力でよしとする。
(鍛治屋は1、薬草師は2)

でもって、indexは、

    <td><%=h item.name %></td>
    <td><%=h item.price %></td>
    <td><%=h item.number_of_times %></td>
    <td><%=h item.creator_id %></td>
    <td><%=h item.creator.name %></td>
    <td><%= link_to 'Show', item %></td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete %></td>

てな具合で、idとnameを表示するようにする。

あとは、「http://localhost:3000/items」を見ると、

Name       Price    Number of times      Creator id      Creator name
ポーション 100      1                    2               herbalist     Show     Edit     Destroy
毒消し     80       1                    2               herbalist     Show     Edit     Destroy
ナイフ     1000     100                  1               smith         Show     Edit     Destroy
ソード     2000     500                  1               smith         Show     Edit     Destroy

となる。

テーブルを関連付けると、itemsテーブルから"."繋ぎでcreatorsテーブル
を参照できるようになる。