2014年7月14日月曜日

テーブルのカラムを追加・削除・名前変更する

 モデルのテーブルにカラムを追加する方法が、私の持っている本では素人にわかるように解説してくれていない。素人だからこそ設計なんてめちゃくちゃだし、すぐに必要になるんですが…。
 昨日まではわからなくなるとモデルを新しく作り直していたので、どうすべきか確認しておく。とりあえずscaffoldで適当なMVCを作ってマイグレーション。
$rails g scaffold PrctModel name:string level:integer
$rake db:migrate
 このときのマイグレーションファイルはこんな感じでした。
class CreatePrctModels < ActiveRecord::Migration
  def change
    create_table :prct_models do |t|
      t.string :name
      t.integer :level
      t.timestamps
    end
  end
end
 さて、コンソールから適当にデータを突っ込んでみます。
[14] pry(main)> prct = PrctModel.new(name: 'Suzuka', level: 10)
[15] pry(main)> prct.save
 もしくは、
[17] pry(main)> prct = PrctModel.create(name: 'Suzuka', level: 10)
この辺もずっと前に意味わからず打ち込んでいたけど、慣れというのは恐ろしいもので、説明はまだちゃんとできないけど身体が少しずつ動くようになってきているかも。
 さて、PrctModel.allとかすると正しくレコードが登録されていることが確認できました。
 ここで、levelをlevel_singに変更、カラムlevel_danceを追加してみます。してみますってこの時点でどうやるかわかってないんですが。
 ふふーん。マイグレーションファイルをコマンドで作ればいいみたい。多分コンソール上やマイグレーションファイルを書き換えても操作できちゃうんでしょうけど、今回はスルーしておきます。

 追加は次のコマンド。クラス名としてAddColumn[変更元カラム名]To[テーブル名]、その後に[変更先カラム名]を入れれば良いみたい。Columnは省略できるっぽいけど、一応書いておきます。
$rails g migration AddColumnLevelDanceToPrctModel level_dance:integer
マイグレーションファイルは上のコマンドからいい感じに作ってくれました。
class AddColumnLevelDanceToPrctModel < ActiveRecord::Migration
  def change
    add_column :prct_models, :level_dance, :integer
  end
end
 これでマイグレーションしてコンソールで確認したら、確かにカラムが増えていました。

 カラムの削除は次の通り。モデル名の前置詞がToではなくてFromです。
$rails g migration RemoveColumnLevelFaceFromPrctModel level_face:integer
 こちらもマイグレーションファイルはいい感じに作ってくれますが、:integerとかの変数型はちゃんと記さないとまずそうです。変数型を書かずにマイグレーションファイルを作ったところ、ファイル内で変数型が:stringになっていて、削除後にロールバックすると変数型が:stringになってしまいそう。

 カラム名の変更は下記の通り。
$rails g migration RenameColumnLevelToPrctModel level_sing
class RenameColumnLevelToPrctModel < ActiveRecord::Migration
  def change
  rename_column :prct_models, :level, :level_sing
  end
end

 この、マイグレーションファイル内でテーブル名が複数形になる意味がよくわからない…。(単数形で試したらエラーになった。)

参考:
【Rails】migrationのchangeとup/downって何が違うの?

0 件のコメント:

コメントを投稿