【備忘録】Rails5でモデル名を変更する方法


前提条件

OS:Mac OS X
Rails:5.2.3
groupモデルをroomモデルに変更します。

モデル名の変更方法

最初に結論から。
そのあとそれぞれのコマンドの解説をしています。
※置換で一気に変更する際は、migrationファイルなど変更したくないファイルには気をつけてください。

1. 変更するモデルに対応するDBのテーブル名を変更

20190815230119_rename_groups.rb
  def change
    # :groupsが変更前
    rename_table :groups, :rooms
  end

変更内容をDBに反映

ターミナル
   $ rails db:migrate

2.モデルに関連するファイル名を全て変更

ターミナル
   # find 対象ディレクトリ | xargs rename -s 変更前のファイル名 変更後のファイル名
   $ find ./ | xargs rename -s group room
   $ find ./ | xargs rename -s Group Room

■ 実行結果の例 ■
groups_controller.rb
    ↓
rooms_controller.rb

3.モデルが使用されてるファイルの中身を全て変更

ターミナル
   # find 対象ディレクトリ -name "検索する文字列" | LC_ALL=C xargs sed -i -e "s/変換前/変換後/g"
   $ find ./ -name "*room*" | LC_ALL=C xargs sed -i -e "s/group/room/g"
   $ find ./ -name "*room*" | LC_ALL=C xargs sed -i -e "s/Group/Room/g"

■ 実行結果の例 ■
class Admin::GroupsController < ApplicationController
           ↓
class Admin::RoomsController < ApplicationController

4.バックアップとしてできたファイルを削除

なぜかファイル名の末尾に-eとつくバックアップのファイルが生成されたため削除する。

ターミナル
   # find 対象ディレクトリ -name "検索する文字列" | xargs rm
   $ find ./ -name "*.*-e" | xargs rm

■ 実行結果 ■
下記のようなファイル名の末尾に-eとつくファイルが削除された。
groups_controller.rb-e

使用したコマンドの解説

findコマンド

ファイルやディレクトリを検索できる。

オプション コマンドの説明
-name ファイル名を指定して検索できる

xargsコマンド

前に実行したコマンドの結果を引き継げる。

ターミナル
   # find 対象ディレクトリ | xargs rename -s 変更前のファイル名 変更後のファイル名
   $ find ./ | xargs rename -s group room

上記の例だと、「find ./」で自分がいる階層のファイルとディレクトリを検索している。
xargsを使ってその検索結果を引き継ぎ、引き継いだ検索結果の中からファイル名がgroupの
ものをroomに変更している。

sedコマンド

ファイルの中身のテキストを置換できる。

オプション コマンドの説明
-i ファイルを上書きする
s 正規表現で置換処理をする
g マッチした全ての文字列を置換する

-eコマンドはちょっとよくわかんない。
ご存知の方、ご教授いただけると助かります。

LC_ALL=C

出力する言語や時刻などのフォーマットを設定する。
LC_ALL=Cはデフォルトの言語(英語)で出力される。

デフォルトの言語を日本語にしているせいかこれつけないとillegal byte sequence
っていうエラーがでるからつけてます。

終わりに

モデル名の変更に時間がかかったので自分用のメモとしてこの記事を書きました。
皆様のモデル名の変更するときの参考になれば幸いです。

なぜバックアップのファイルが出力されたのか謎。