テーブル間での連携
テーブルとテーブルを結合してみる。
道具には作った人がいるだろうということで、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テーブル
を参照できるようになる。