55

アプリに不要になったモデルとテーブルがあります。そのままにしておくこともできますが、整理整頓のために削除したいと思います。

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

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

方法1

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

rails db
DROP TABLE table_name
\q
rails destroy model model_name

これを行うと、このモデル/テーブルの移行はどうなりますか?このモデルには、timestamp_create_modelnameとadd_attribute_to_tablenameの2つの移行があります。

また、このメソッドはdb / schema.rbファイルを更新しますか?

アプリをHerokuにプッシュすると、モデルは削除されますが、テーブルはそのまま残ります。テーブルを削除するためのherokuコマンドはありますか。

方法2

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

rails generate migration drop_tablename

&次に以下のファイルを更新します:

db / migrate / timestamp_drop_tablename (以下のDan Wichの回答に応じて更新)

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 / schemaを更新して、db / migrate / timestamp_drop_tablenameによってオーバーライドされるだけですか?

私は2番目の方法を試してみてうれしいですが、経験のある人に量ってもらい、これを行うための方法を教えてもらいたいと思います。

4

2 に答える 2

32

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

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

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

于 2013-03-26T22:16:12.353 に答える
13

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

rails g migration DropYourModel
rails destroy scaffold YourModelName

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

rake db:migrate

モデルが名前空間で定義されている場合、たとえば、admins最初のコマンドを次のように置き換えます

rails destroy scaffold admins/YourModelName
于 2015-05-29T14:27:42.603 に答える