DBの管理画面を簡単に作成できるActiveAdminを使っている場合に、DBから特定のテーブルを削除しても、その内容はActiveAdminに反映されません。
管理画面上には消したテーブルへのリンクが残ってしまいます。
ここでは、テーブルを削除した場合に、その内容をActiveAdminに反映させ、管理画面のテーブル一覧から該当するテーブルを消す方法について解説しています。
ActiveAdminの管理画面からテーブルを削除する手順
テーブルを削除する
まずはDB上から該当するテーブルを削除します。手順は次のとおりです。
- テーブルの削除
- 関連ファイルの削除(手動で行う)
テーブルを削除するときに、rails destroy model <モデル名>
を実行するのは非推奨です。
このコマンドを実行するとマイグレーションファイルも削除されるので、ロールバックができなくなります。
テーブルの削除
既存のテーブルを削除する場合、rails g migration
で実行するコードは次のような形になります。
rails g migration Drop<テーブル名>
実際にカラムを追加するには、マイグレーションファイルにdrop_tableを追加します。(※デフォルトでは何も記述がありません)
drop_tableはchangeメソッドに対応していますが、ロールバックを可能にするにはブロック形式で記述する必要があります。(通常は元のカラムの型やオプションをすべて指定します)
(参考)【Rails】マイグレーションファイルでchangeメソッドが使える定義一覧表
対応をしないとエラーが発生します。エラーを回避する書き方はいくつかあります。
class <クラス名> < ActiveRecord::Migration[6.1]
def change
drop_table :<テーブル名> do |t|
t.<型1> :<カラム名1>, <オプション: 値>,,,
t.<型2> :<カラム名2>, <オプション: 値>,,,
,,,
end
end
end
複数のカラムを削除したい場合は、その分だけdrop_tableの行を追加します。
テーブルを使う予定がない場合
テーブルを使う予定がない場合は、カラムと型をあえて指定せず、ブロック内の処理を空の状態にする方法もあります。
class <クラス名> < ActiveRecord::Migration[6.1]
def change
drop_table :<テーブル名> do
end
end
end
関連ファイルの削除
DBのテーブルが削除できたら、続いて関連するファイルを削除します。削除するのは次の3つです。
いずれも、rails g model
を実行したときに自動生成されたファイルです。
- modelファイル (app/models/xxx.rb)
- testファイル (test/models/xxx_test.rb)
- fixturesファイル (test/fixtures/xxx.yml)
関連ファイルを削除するときに、マイグレーションファイルは削除しないようにします。
マイグレーションファイルを削除するとロールバックが正常にできなくなり、DBの過去の状態を復元できなくなるリスクがあります。
以上でテーブルの削除処理は完了です。
ActiveAdminの管理画面からテーブルを削除する
ActiveAdminの管理画面からテーブルを削除する手順は次のとおりです。
- adminディレクトリの登録ファイルを削除する
- アプリケーションの再起動
adminディレクトリの登録ファイルを削除する
ActiveAdminでモデルの登録作業を行うと、app > admin配下に、テーブル名.rbというファイルが生成されます。
ActiveAdminの管理画面からテーブルを削除するには、このファイルを削除します。
DBからテーブルを削除した状態で、app > admin配下の対象のファイルが残っていると、rails起動時にエラーが発生します。
rails-vue-web | => Booting Puma
rails-vue-web | => Rails 6.1.4 application starting in development
rails-vue-web | => Run bin/rails server --help
for more startup options
rails-vue-web | Exiting
rails-vue-web | /rails-vue/app/admin/students.rb:1:in `’: uninitialized constant Student (NameError)
(省略)
rails-vue-web exited with code 1
アプリケーションの再起動
ファイルを削除しただけでは管理画面に変更内容が反映されません。変更を反映させるためにアプリケーションを再起動します。
以上でActiveAdminからテーブルを削除する処理は完了です。
実例
実際にRailsのアプリケーションからstudentsテーブルを削除し、その内容をActiveAdminに反映させるまでの流れです。
削除前の管理画面だとStudentsテーブルが入っています。ここからStudentsを削除します。

※スタイルが適用されていませんが、通常のActiveAdminと同じです。スタイルについては無視してください。
(参考)スタイル適用後の画面例

テーブルの削除
まずは、DBからテーブルを削除します。
マイグレーションファイルの生成
テーブルを削除するためのマイグレーションファイルを作成します。
Railsアプリケーションを実行しているディレクトリでrails g migration DropStudents
コマンドを打ちます。
# rails g migration DropStudents
Running via Spring preloader in process 93
invoke active_record
create db/migrate/20210804012341_drop_students.rb
マイグレーションファイルが生成されました。
マイグレーションファイルの編集
drop_tableを実行するためには、changeメソッドの中身をブロックで記述します。
デフォルトではchangeメソッドに何も記載されていません。
class DropStudents < ActiveRecord::Migration[6.1]
def change
end
end
↓ マイグレーションファイルに処理を記述
class DropStudents < ActiveRecord::Migration[6.1]
def change
drop_table :students do
end
end
end
削除対象のstudentsテーブルを再利用する予定はないので、カラムと型などは省略します。
マイグレーション状況の確認
マイグレーション実行前に、rails db:migrate:status
コマンドでマイグレーションの状況を確認しておきます。
# rails db:migrate:status
database: rails_vue_development
Status Migration ID Migration Name
--------------------------------------------------
up 20210719082013 Create clients
up 20210719103420 Create active admin comments
up 20210720011142 Create students
down 20210804012341 Drop students
先ほど作成した、マイグレーションのバージョン20210804012341のDrop studentsのみステータスがdownになっています。
この状態でrails db:migrate
を実行すれば、このファイルのみが実行され、UPになります。実行したい内容と一致しているのでこれで確認は完了です。
マイグレーション状況の確認
rails db:migrate
コマンドでマイグレーションを実行します。
# rails db:migrate
== 20210804012341 DropStudents: migrating =====================================
-- drop_table(:students)
-> 0.0231s
== 20210804012341 DropStudents: migrated (0.0232s) ============================
以上で、DBからstudentsテーブルを削除することができました。
モデル関連のファイルを削除
studentsテーブルは存在しないので、studet.rbなどの次の3つのファイルを削除します。
- modelファイル (app/models/student.rb)
- testファイル (test/models/student_test.rb)
- fixturesファイル (test/fixtures/students.yml)
以上でRailsアプリとDBの処理は完了です。
ActiveAdminのadminディレクトリの登録ファイルを削除する
続いて、ActiveAdminの処理に移ります。app > adminディレクトリ配下にある、students.rbファイルを削除します。

# rm app/admin/students.rb
アプリケーションを再起動する
ctrl + cでアプリケーションを終了し、rails s で再起動します。
以上で、ActiveAdminの管理画面から対象のstudentsテーブルが削除されます。
ブラウザで確認
最後にテーブルの削除がActiveAdminに正しく反映されているか確認します。

studentsのリンクが無くなっていることが確認できます。以上で完了です。
関連リンク
- Docker上のRails6にActiveAdminを導入する方法
- 【Rails】ActiveAdminに後からdevise(ユーザー管理機能)を追加する方法
- 【Rails】ActiveAdminで0x0000558bcのような表示を修正する方法(belongs_toやhas_many関係のテーブルのカラムを指定する)