Mac、WindowsでRuby On Railsをインストール、サービス構築するまでの詳細情報を紹介します。

ホーム / Ruby On Rails Migration

更新:11/10/05 | Ruby On Rails Migration DB管理編 | Ruby On Rails

テーブルの作成

DBのテーブルは、migrationというコマンドと考え方で整理して簡単に管理することができます。
その名の通り、次々に変化していくであろうDBのテーブルスキーマをマイグレーション(進化?)させていくプロセスを、Railsがシステムとしてサポートしてくれているイメージです。

作成するテーブルは3つあるので、それぞれ次のようにモデルのクラス名を命名しました。

User
Skill
Connection

それぞれのクラスのひな形を作成します。
Generators他部を選択します。この他部はその名の通り「Gnerates=ひな形を作り出す」機能を持っています。
左手のリストから「model」を選択します。modelをのひな形を作り出すことになります。
モデルのひな形を作ると、同時にmigrationのひな形も作成されます。
クラス名を右手の引数に入力します。
最後にGoボタンをクリックすると、自動的にひな形が作成されます。

skillmapper\app\models\users.rb

としてモデルクラスが作成されます。
加えて、

skillmapper\db\migrate\001_create_users.rb

としてcreateと付け加えられたマイグレーションクラスが作成されます。

しかし、どちらも中を開くと空っぽです。

マイグレーションクラス

class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
end
end

def self.down
drop_table :users
end
end

自動的に生成してくれると言っても、この段階ではこの程度です。
直感的に想像できるとおり、self.upはマイグレーション時に実行されるパートで、self.downはデグレーションつまり巻き戻しをした場合に実行されるコードになります。

マイグレーションクラスには、どんなスキーマになるかは具体的に入力する必要があります。
DBに関する操作には次のような関数が用意されています。

create_table(name, options)
テーブルを作成する。:force => true で既存のテーブルを上書きする。
drop_table(name)
テーブルを削除する。
add_column(table_name, column_name, type, options)
カラムを追加する。
remove_column(table_name, column_name)
カラムを削除する。
rename_column(table_name, column_name, new_column_name)
カラム名を変更する。
change_column(table_name, column_name, type, options)
カラムの型を変更する。
add_index(table_name, column_name, index_type)
インデックスを追加する。
remove_index(table_name, column_name)
インデックスを削除する。
execute(sql)
SQL文を実行する。
Base#reset_column_information
即座にカラムの情報を更新する。

既に、自動的にcreate_tableというテーブルを作成する関数が挿入されています。
ただ、テーブルが作成されてもカラムがないと意味がありませんので、追加していきます。

create_table :users do |t|

の最後に指定されている

do |t|
end

という記述は、作成されたテーブルオブジェクトをtとしてendと挟まれた間で指定できるお膳立てをしています。
VBでいうwithに近いものでしょうか……。

t.column :id, :integer, :null => false

と指定すると、今作成したてのテーブルtの絡むとして、idという名前でinteger(整数値型)のカラムを作成しNot Null制約を持たせることを意味します。

抽象表現 Ruby型 PostgreSQL型 MySQL型
:primary_key Fixnum serial primary key int(11) DEFAULT NULL auto_increment PRIMARY KEY
:string String character varying(255) varchar(255)
:text String text text
:integer Fixnum integer int(11)
:float Float float float
:datetime Time timestamp datetime
:timestamp Time timestamp datetime
:time Time timestamp datetime
:date Date date date
:binary String bytea blob
:boolean Object boolean tinyint(1)
http://tech.feedforce.jp/railsmigration.html

だそうです。この辺りは、今後増えたり修正されるかもしれません。

:limit 数値で桁数指定
:default デフォルト値を指定
:null true or false

といったオプションもカンマで区切って指定できます。

CreateUsersクラスは結果的に以下のようにしました。

def self.up
create_table :users do |t|
t.column :first_name, :string, :null => false
t.column :last_name, :string, :null => false
end
end

ここで重要なのは、ユーザーを一位に決定するプライマリキーidは、Railsの中で特殊な存在として扱われている点です。
そのため、CreateUsersクラスにidというカラムの作成を指定しなくても自動的にidという絡むが作成されます。

Ctrl+Sでファイルを保存したら、実際にマイグレーションをかけてみます。
今度は、Eclipseの下段にあるタブからRake Tasksを選択します。
左側のリストからdb:migrateを選択しGoボタンをクリックします。
自動的にDBテーブルが作成されます。
成功時のログは以下の通りです。

(in /Users/minoru/Documents/RoR/skillmapper)
== CreateUsers: migrating =====================================================
-- create_table(:users)
-> 0.0515s
== CreateUsers: migrated (0.0527s) ============================================

== CreateSkills: migrating ====================================================
-- create_table(:skills)
-> 0.0064s
== CreateSkills: migrated (0.0080s) ===========================================

== CreateConnections: migrating ===============================================
-- create_table(:connections)
-> 0.0058s
== CreateConnections: migrated (0.0065s) ======================================

エラーが表示された場合は、内容を確認指定可のような状態に陥っていないか見直します。
MySQLが起動していない。
DBが作成されていない。

CreateSkillsクラス

skillmapper\db\migrate\002_create_skills.rb
に以下のようにコードを追加します。

class CreateSkills < ActiveRecord::Migration
def self.up
create_table :skills do |t|
t.column :name, :string
end
end

def self.down
drop_table :skills
end
end

CreateConnectionsクラス

skillmapper\db\migrate\003_create_connections.rb
に以下のようにコードを追加します。

class CreateConnections < ActiveRecord::Migration
def self.up
create_table :connections do |t|
t.column :skill_id, :integer
t.column :user_id, :integer
t.column :value, :integer
t.column :time, :timestamp
end
end

def self.down
drop_table :connections
end
end

 

 

 
コメント・フィードバック
ダウンロード
ストリーミング関連
Macintosh関連
Windows関連
メディアなど
 
ハードウェア
ソフトウェア/サービス/開発SDK
デジタル一眼レフカメラ
趣味関連
ゲーム 〜楽しいゲームの紹介や攻略法
RoverMNI(ローバーミニ) 
雑記
その他
Copyright (c)1998-2016 CNXGROUP All Rights Reserved.
このページの全部あるいは一部を無断で利用(コピー)することを禁じます。
>