2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでテーブルのカラム名を安全にリネームする

Last updated at Posted at 2019-12-23

テーブルのカラム名を変更した時のメモ

環境

  • Rails 5.2.4
  • MySQL 5.7.28

背景

テーブルのカラム名がイケてないので変えたいけど、使用箇所が多いので手を出しにくい。
でもカラム名を変えたい。

やること

  1. テーブルのカラム名を変える
  2. 警告を出すための独自Deprecatorを作成する
  3. 変更前のカラム名でもアクセスできるようにエイリアスを貼る

段階的に使用箇所を修正していけるという寸法です。

やり方

1. テーブルのカラム名を変える

普通にカラム名を変更するマイグレーションを作ります。
例としてUsersテーブルのnameカラムをfull_nameにリネームします。

app/db/migrate/rename_name_to_users.rb
class RenameNameToUsers < ActiveRecord::Migration[5.2]
  def change
    rename_column :users, :name, :full_name
  end
end

2. 警告を出すための独自Deprecatorを作成する

app/supports/deprecator/will_be_removed.rb
class Deprecator::WillBeRemoved
  def deprecation_warning(deprecated_method_name, message)
    ActiveSupport::Deprecation.warn("`#{deprecated_method_name}` will be removed. #{message}")
  end
end

3. 変更前のカラム名でもアクセスできるようにエイリアスを貼る

app/models/user.rb
class User < ApplicationRecord
  # TODO: 一時的なエイリアス
  alias_attribute :name, :full_name
  deprecate name: 'Please use `full_name` instead.', deprecator: Deprecator::WillBeRemoved.new
  deprecate 'name=': 'Please use `full_name` instead.', deprecator: Deprecator::WillBeRemoved.new
end

確認

$ rails c
pry(main)> user = User.find(1)
pry(main)> user.name
DEPRECATION WARNING: `name` will be removed. Please use `full_name` instead. (called from <main> at (pry):3)
=> "test name"
pry(main)> user.full_name
=> "test name"

補足

独自のDeprecatorを作成しなくても警告を出すことはできます。

app/models/user.rb
class User < ApplicationRecord
  # TODO: 一時的なエイリアス
  alias_attribute :name, :full_name
  deprecate name: 'Please use `full_name` instead.'
  deprecate 'name=': 'Please use `full_name` instead.'
end

が、以下のようにRails用の警告文になってしまうので独自に作った方が良いと思います。

pry(main)> user.name
DEPRECATION WARNING: name is deprecated and will be removed from Rails 6.0 (Please use `full_name` instead.) (called from <main> at (pry):3)

参考

Railsのカラムにaliasをかける
railsのdeprecateってメソッドが便利ぽい

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?