web-dev-qa-db-ja.com

Rails 3でテーブルを削除してモデルを削除する最良の方法は何ですか

私のアプリにはもう必要ないモデルとテーブルがあり、そこに置いておくことができますが、整理しておくためにそれらを削除したいと思います。

私はmigrationsdb /をいじってそれらを削除する最良の方法を見つけようとしていますschema.rbファイルと、本番環境に及ぼす可能性のある副作用、アプリはHerokuにあります。ローカルマシンとherokuの両方でPostgreSQLを使用しています。

これまでのところ、これを行う2つの方法を見つけましたが、どちらが最良の方法であるかはわかりません/ Rails way?

方法1

データベースにアクセスして、テーブルを削除してからモデルを破棄することを考えました。

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コマンドはありますか。

方法2

私が読んだ別の方法は、新しい移行を生成してテーブルを削除してからモデルを破棄することでした。

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これを行う方法を教えてください。

53
Holly

2番目の方法は、これを処理する理想的な方法です。移行ファイルは、データベースが時間とともにどのように変化したかを表すことを目的としています。古い移行ファイルはプロジェクトに残りますが(仮に、古いバージョンにロールバックしたい場合)、Railsはrake db:migrate(データベースのschema_migrationsテーブルのデータに基づいて)既に実行されていることがわかっているため。

Schema.rbは、データベースにそのテーブルが含まれなくなったことを反映するために、一度更新されるだけです。

コードの微調整:移行ファイルはupメソッドでテーブルを削除し、理想的にはdownメソッドで再作成する必要があります。 「up」は、移行が時間内に進むためにテーブルをドロップし、移行がロールバックされる場合、downメソッドが実行されることを意味します。

32
Dan Wich

これは古いスレッドです。多くの場合、モデルだけでなく、そのモデルに関連付けられているルート、コントローラー、ビューも削除する必要があります。それを行うには、これらを実行します

Rails g migration DropYourModel
Rails destroy scaffold YourModelName

移行ファイルをdrop_tableに編集してから実行します

rake db:migrate

モデルが名前空間で定義されている場合(例:admins)、最初のコマンドを

Rails destroy scaffold admins/YourModelName
13
MichaelZ