railsのmigrationについてあまりちゃんと理解できていなかったのでメモメモ。
Contents
railsにおけるmigrationとは ??
「migration」
:移動
:移住
英語ではこのような意味があるようです。
しかし、railsをやっていると『移住』『移動』はイマイチピンと来ませんよね。。。?
migrationという言葉を見るのはおそらくデータベースに関係したことをしている時じゃないでしょうか。
migrationとはデータベースに何らかの変更を加える時に出てくる言葉です。
migrationをすることによって、SQLを直接いじることなく簡単にデータベースをいじることができるのです。
やっぱり、この『言葉の意味』と『実際の用途』をリンクして考えるのは少し難しいです。
リンクして考えることができると概念が掴みやすく、理解しやすいのですが。。。
こういったときは。。。
とにかくやってみましょう!
実際にmigraionをしてみる
migrationが必要になるのは、
データベースに変更を加えたとき・・・つまり
『テーブルを作成したとき』や『テーブルにカラムを追加したとき』です。
それでは早速やっていきましょう。
ターミナルを開いてください。
rails g model Note title:string content:text
と打ってください。
するといくつかのファイルが作成されます。
その中に
migrationファイルがあります!
私の場合は『20170320151822_create_notes.rb』というファイルです。

データベースに変更を加える際に実行するmigrationとは
rails db:migrate
というコマンドを打つことで完了します。(まだ打たなくていいですよ!)
このmigrationは今作成した20170320151822_create_notes.rbというファイルを元に実行されます。
それでは、migrationファイルを見てみましょう。
class CreateNotes < ActiveRecord::Migration[5.0] def change create_table :notes do |t| t.string :title t.text :content t.timestamps end end end
create_table :notes
『notesテーブルを作成します』と宣言されています。
t.string :title t.text :content
t.データ型 :カラム名
という構造になってます。
つまり、
『string型のtitleというカラムと、
text型のcontentというカラムがあるnotesというテーブルを作る』という内容になっています。
シンプルですね。
それでは、migrationしましょう!
rails db:migrate
ですね!
このようになれば成功です!
notesテーブルをcreateしています。

確認しましょう!
本当にtitleとcontentのカラムがあるnotesテーブルが作成されたのか確認してみましょう。
rails c
からの
Note.column_names
とコマンドを打ってください。
model名.column_namesでカラムを確認することができます。

上手く入ってますね!
でもやっぱりmigrationを取り消したい!
今やったmigrationを取り消したいなぁって時もありそうですよね!
そういったときは
rails db:rollback
をしましょう。
このコマンドをすることによって、
直近のmigrationを取り消すことができます。
このようになれば成功です。
notesテーブルをdrop(消去)することで、さっきのmigrationをなかったことにしています。

しかし、migrationファイルは消えない
tableをdropしたからといってmigrationファイルは消えません。
もし、今再度
rails db:migrate
すると、さっきと同じ構造のテーブルが作成されます。
ここで、
migrationファイルを少し編集してみましょう。
t.text :body
を追加しました。
class CreateNotes < ActiveRecord::Migration[5.0] def change create_table :notes do |t| t.string :title t.text :content t.text :body t.timestamps end end end
そして
rails db:migrate
しましょう。
最初にnotesテーブルを作成した時と同じようになれば成功です!

さらに確認!
カラムの確認方法は
rails c
からの
Note.column_names
でしたね!

ちゃんとbodyがあるのが確認できました!
今回は以上です!