私のアプリにはもう必要ないモデルとテーブルがあり、そこに置いておくことができますが、整理しておくためにそれらを削除したいと思います。
私はmigrations&db /をいじってそれらを削除する最良の方法を見つけようとしていますschema.rbファイルと、本番環境に及ぼす可能性のある副作用、アプリはHerokuにあります。ローカルマシンとherokuの両方でPostgreSQLを使用しています。
これまでのところ、これを行う2つの方法を見つけましたが、どちらが最良の方法であるかはわかりません/ Rails way?
データベースにアクセスして、テーブルを削除してからモデルを破棄することを考えました。
Rails db
DROP TABLE table_name
\q
Rails destroy model model_name
これを行うと、このモデル/テーブルの移行はどうなりますか?このモデルには、timestamp_create_modelnameとadd_attribute_to_table名の2つの移行があります。
また、このメソッドはdb/schema.rbファイルを更新しますか?
アプリをHerokuにプッシュすると、モデルは削除されると思われますが、テーブルはそのまま残ります。テーブルを削除するherokuコマンドはありますか。
私が読んだ別の方法は、新しい移行を生成してテーブルを削除してからモデルを破棄することでした。
Rails generate migration drop_tablename
そして、以下のファイルを更新します。
db/migrate/timestamp_drop_tablename (以下のダン・ウィッチの回答に応じて更新)
class DropTablename < ActiveRecord::Migration
def up
drop_table :tablename
end
def down
create_table :tablename do |t|
t.string :table_column
t.references :anothertable
t.timestamps
end
add_index :tablenames, :anothertable_id
end
end
そして、ターミナルで:
rake db:migrate
Rails destroy model model_name
rake db:migrate
git add .
git commit -m "removed table/model_name"
git Push heroku master
heroku run rake db:migrate
heroku restart
これが最善の方法のようですが、古い移行ファイルはどうなりますか? rake db:migrateを実行するたびにdb/shrateが残り、db/migrate/timestamp_drop_tablenameによってオーバーライドされるだけですか?
2番目の方法を試してみるのはうれしいですが、経験のある人が計量して、Railsこれを行う方法を教えてください。
2番目の方法は、これを処理する理想的な方法です。移行ファイルは、データベースが時間とともにどのように変化したかを表すことを目的としています。古い移行ファイルはプロジェクトに残りますが(仮に、古いバージョンにロールバックしたい場合)、Railsはrake db:migrate
(データベースのschema_migrationsテーブルのデータに基づいて)既に実行されていることがわかっているため。
Schema.rbは、データベースにそのテーブルが含まれなくなったことを反映するために、一度更新されるだけです。
コードの微調整:移行ファイルはup
メソッドでテーブルを削除し、理想的にはdown
メソッドで再作成する必要があります。 「up」は、移行が時間内に進むためにテーブルをドロップし、移行がロールバックされる場合、down
メソッドが実行されることを意味します。
これは古いスレッドです。多くの場合、モデルだけでなく、そのモデルに関連付けられているルート、コントローラー、ビューも削除する必要があります。それを行うには、これらを実行します
Rails g migration DropYourModel
Rails destroy scaffold YourModelName
移行ファイルをdrop_table
に編集してから実行します
rake db:migrate
モデルが名前空間で定義されている場合(例:admins
)、最初のコマンドを
Rails destroy scaffold admins/YourModelName