##目的
マイグレーションのカラムの追加や削除、データ型変更の方法をまとめてみました。
##バージョン
Rails 5.1.6
ruby 2.3.1p112
##カラムを追加したい時
書き方は以下の構文をとります。
$ rails g migration Addカラム名Toテーブル名 カラム名:カラムのデータ型
早速入れてみます。
$ rails g migration AddUserIdToBlogs user_id:integer
Running via Spring preloader in process 1697
invoke active_record
create db/migrate/20181009062338_add_user_id_to_blogs.rb
マイグレーションのファイルは以下の通りになりました。
20181009062338_add_user_id_to_blogs.rb
class AddUserIdToBlogs < ActiveRecord::Migration[5.1]
def change
add_column :blogs, :user_id, :integer
end
end
migrateも忘れずに行います。
$ rails db:migrate
== 20181009062338 AddUserIdToBlogs: migrating =================================
-- add_column(:blogs, :user_id, :integer)
-> 0.0081s
== 20181009062338 AddUserIdToBlogs: migrated (0.0082s) ========================
schema.rbのファイルを確認するとしっかり入っているのが確認できます。
schema.rb
create_table "blogs", force: :cascade do |t|
t.string "title"
t.text "content"
t.integer "user_id"
end
##カラムを削除したい時
blogsテーブルからuser_idを削除してみる
書き方は以下の構文をとります。
$ rails generate migration removeカラム名toテーブル名 カラム名
早速入れてみます。
$ rails g migration RemoveUserIdToBlogs user_id
Running via Spring preloader in process 1887
invoke active_record
create db/migrate/20181009065934_remove_user_id_to_blogs.rb
isaatsu:~/workspace/blogs (master) $
マイグレーションのファイルは以下の通りになりました。
20181009065934_remove_user_id_to_blogs.rb
class RemoveUserIdToBlogs < ActiveRecord::Migration[5.1]
def change
remove_column :blogs, :user_id, :string
end
end
こちらもmigrateしましょう。
$ rails db:migrate
== 20181009065934 RemoveUserIdToBlogs: migrating ==============================
-- remove_column(:blogs, :user_id, :string)
-> 0.0121s
== 20181009065934 RemoveUserIdToBlogs: migrated (0.0123s) =====================
最後にschema.rbのファイルを確認します。
schema.rb
create_table "blogs", force: :cascade do |t|
t.string "title"
t.text "content"
end
##カラムのデータ型を変えたい時
user_idのデータ型をstring(文字列)からinteger(数値)に直したい場合を想定します。
最初のスキーマファイルは以下の通りです。
schema.rb
create_table "blogs", force: :cascade do |t|
t.string "title"
t.text "content"
t.string "user_id" #ここをstring→integerにしたい
end
構文は以下の通りです。
$ rails g migration ChangeDatatypeカラム名Ofテーブル名
実行してみます。
$ rails g migration ChangeDatatypeUseIdOfBlogs
Running via Spring preloader in process 2043
invoke active_record
create db/migrate/20181009071753_change_datatype_use_id_of_blogs.rb
ファイルが作成できました。
20181009071753_change_datatype_use_id_of_blogs
class ChangeDatatypeUseIdOfBlogs < ActiveRecord::Migration[5.1]
def change
end
end
ファイルが作成できたのでその中に追記をします。
20181009071753_change_datatype_use_id_of_blogs
class ChangeDatatypeUseIdOfBlogs < ActiveRecord::Migration[5.1]
def change
change_column :blogs, :user_id, 'integer USING CAST(user_id AS integer)'
end
end
migrateします。
$ rails db:migrate
== 20181009071753 ChangeDatatypeUseIdOfBlogs: migrating =======================
-- change_column(:blogs, :user_id, "integer USING CAST(user_id AS integer)")
-> 0.0690s
== 20181009071753 ChangeDatatypeUseIdOfBlogs: migrated (0.0691s) ==============
schema.rbを確認するとstringのデータ型がintegerに変わっています。
schema.rb
create_table "blogs", force: :cascade do |t|
t.string "title"
t.text "content"
t.integer "user_id" #変更箇所
end