テーブルのカラム名を変更した時のメモ
環境
- Rails 5.2.4
- MySQL 5.7.28
背景
テーブルのカラム名がイケてないので変えたいけど、使用箇所が多いので手を出しにくい。
でもカラム名を変えたい。
やること
- テーブルのカラム名を変える
- 警告を出すための独自Deprecatorを作成する
- 変更前のカラム名でもアクセスできるようにエイリアスを貼る
段階的に使用箇所を修正していけるという寸法です。
やり方
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)