【Rails】ActiveAdminからテーブルを削除する方法

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

DBの管理画面を簡単に作成できるActiveAdminを使っている場合に、DBから特定のテーブルを削除しても、その内容はActiveAdminに反映されません。

管理画面上には消したテーブルへのリンクが残ってしまいます。

ここでは、テーブルを削除した場合に、その内容をActiveAdminに反映させ、管理画面のテーブル一覧から該当するテーブルを消す方法について解説しています。

ActiveAdminの管理画面からテーブルを削除する手順

テーブルを削除する

まずはDB上から該当するテーブルを削除します。手順は次のとおりです。

  1. テーブルの削除
  2. 関連ファイルの削除(手動で行う)
テーブル削除時の注意点

テーブルを削除するときに、rails destroy model <モデル名> を実行するのは非推奨です。

このコマンドを実行するとマイグレーションファイルも削除されるので、ロールバックができなくなります。


テーブルの削除

既存のテーブルを削除する場合、rails g migration で実行するコードは次のような形になります。

rails g migration Drop<テーブル名>

実際にカラムを追加するには、マイグレーションファイルにdrop_tableを追加します。(※デフォルトでは何も記述がありません)

注意点

drop_tableはchangeメソッドに対応していますが、ロールバックを可能にするにはブロック形式で記述する必要があります。(通常は元のカラムの型やオプションをすべて指定します)


(参考)【Rails】マイグレーションファイルでchangeメソッドが使える定義一覧表


対応をしないとエラーが発生します。エラーを回避する書き方はいくつかあります。

(参考)【Rails】エラー対処法:ActiveRecord::IrreversibleMigration: To avoid mistakes, drop_table is only reversible if given options or a block (can be empty).

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を実行したときに自動生成されたファイルです。

  1. modelファイル (app/models/xxx.rb)
  2. testファイル (test/models/xxx_test.rb)
  3. fixturesファイル (test/fixtures/xxx.yml)
注意点

関連ファイルを削除するときに、マイグレーションファイルは削除しないようにします。

マイグレーションファイルを削除するとロールバックが正常にできなくなり、DBの過去の状態を復元できなくなるリスクがあります。

以上でテーブルの削除処理は完了です。


ActiveAdminの管理画面からテーブルを削除する

ActiveAdminの管理画面からテーブルを削除する手順は次のとおりです。

  1. adminディレクトリの登録ファイルを削除する
  2. アプリケーションの再起動


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と同じです。スタイルについては無視してください。

(参考)スタイル適用後の画面例

画像に alt 属性が指定されていません。ファイル名: image-163-1024x514.png


テーブルの削除

まずは、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つのファイルを削除します。

  1. modelファイル (app/models/student.rb)
  2. testファイル (test/models/student_test.rb)
  3. 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のリンクが無くなっていることが確認できます。以上で完了です。


関連リンク


タイトルとURLをコピーしました