テーブル名を変更する必要があったのですが、それに伴いいろいろな箇所を変更しなければならず混乱してしまいました。今後同じ作業をする必要がある方のために、まとめます。
やりたいこと
- テーブル名を修正する
- モデルやコントローラーの名前を修正する
- テスト(今回はRspecを使用している場合)の対応も行う
環境
- Rails 5
前提
今回は、テーブル名trashes
をtrash_objects
に変更すると仮定して進めます。
方法
1. マイグレーションファイルを作成
rails g migration
コマンドを実行し、change_[old_table_name]_to_[new_table_name]
といった名前のマイグレーションファイルを作成します。
$ rails g migration change_trashes_to_trash_objects
2. マイグレーションの中身を書いていく
マイグレーションファイルの中身を書いていきます。
class ChangeTrashesToTrashObjects < ActiveRecord::Migration[5.2]
def change
rename_table :trashes, :trash_objects
end
end
3. モデルを修正する
-
Trash
モデルのファイル名をtrash.rb
からtrash_object.rb
に変更します。ファイル名は単数形なので注意しましょう! -
trash_object.rb
のクラス名をTrash
からTrashObject
に変更します。
# 修正前
class Trash < ApplicationRecord
belongs_to :address
end
# 修正後
class TrashObject < ApplicationRecord
belongs_to :address
end
- Trashに関連していたアソシエーションを修正する
関連しているアソシエーションを書き換えていきます。
# 修正前
class Address < ApplicationRecord
belongs_to :trash
end
# 修正後
class Address < ApplicationRecord
has_many :trash_objects
end
4.コントローラーを修正する
-
Trash
コントローラーのファイル名をtrashes_controller.rb
からtrash_objects_controller.rb
に変更します -
trash_objects_controller.rb
のクラス名をTrashesController
からTrashObjectsController
に変更します
# 修正前
class TrashesController < ApplicationController
end
# 修正後
class TrashObjectsController < ApplicationController
end
3.メソッドを修正する
コントローラのメソッド内に存在している変数名やクラス名などを修正していきます。
# 修正前
def index
trashes = Trash.all
end
# 修正後
def index
trash_objects = TrashObject.all
end
5. ビューを修正する
viewsフォルダーの名前をtrashes
からtrash_objects
に変更します。 viewフォルダー内で使われている変数名なども必要に応じて変更してください。
6. マイグレートを忘れずに!
このタイミングでmigrateをすると良いでしょう。
※ routes.rb
を修正する前にdb:migrate
をしないとエラーになるそうです!
rails db:migrate
7. ルートを修正する
今度はルートを修正していきます。
# 修正前
# get 'trashes/index', to: 'trashes#index'
# get 'trashes/show', to: 'trashes#show'
# 修正後
get 'trash_objects/index', to: 'trash_objects#index'
get 'trash_objects/show', to: 'trash_objects#show'
8. テストコードの修正
- ファイル名を
trashes_spec.rb
からtrash_objects_spec.rb
修正します -
_path
を使っている場合は、新しい名前でのパス名に修正します
# 修正前
# RSpec.describe 'TrashesAPI', type: :request do
# describe 'GET /api/v1/trashes/index' do
# it 'returns successfully' do
# get api_v1_trashes_index_path
# ....[省略]
# end
# end
# end
# 修正後
RSpec.describe 'TrashObjectsAPI', type: :request do
describe 'GET /api/v1/trash_objects/index' do
it 'returns successfully' do
get api_v1_trash_objects_index_path
# ....[省略]
end
end
end
以上・・・かな?
以上です!使っているライブラリや構造によって他にも変更箇所は増える可能性があるとは思いますが、基本的な箇所は網羅できていると思います。
宣伝: Railsアプリの作り方を学べる教材を公開しています
Techpit様にて、Ruby on RailsとVue.jsでリアルタイムチャットアプリを作る教材を公開しています。
devise_token_auth
を使ったトークン認証、HTTP通信やAction Cableを使用したWebsocket通信についても詳しく説明しています。Rails APIモードでアプリケーションを作って見たい方はぜひ購入してください!