LoginSignup
39
46

More than 5 years have passed since last update.

railsのカラム追加、削除、データ型変更の方法

Posted at

目的

マイグレーションのカラムの追加や削除、データ型変更の方法をまとめてみました。

バージョン

Rails 5.1.6
ruby 2.3.1p112

カラムを追加したい時

blogsテーブルにuser_idを追加してみる
unspecified.png

書き方は以下の構文をとります。

$ 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を削除してみる

unspecified-1.png

書き方は以下の構文をとります。

$ 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
39
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
46