Каков наилучший способ сбросить таблицу и удалить модель в Rails 3?

У меня есть модель и таблица, которые мне больше не нужны в моем приложении, я мог бы оставить их там, но я хотел бы удалить их, чтобы все было в порядке.

Я пытаюсь найти лучший способ удалить их с помощью беспорядков с моими миграциями и файлами db/schema.rb и любым побочным эффектом, который он может иметь в моей рабочей среде, мое приложение находится на Heroku. Я использую PostgreSQL как на своей локальной машине, так и на геройку.

До сих пор я нашел два способа сделать это, но не уверен, какой метод наилучшего метода/рельсов?

Метод 1

Я думал о том, чтобы просто войти в мою базу данных и сбросить таблицу, а затем уничтожить модель.

rails db
DROP TABLE table_name
\q
rails destroy model model_name

Если я сделаю это, что произойдет с миграциями, которые у меня есть для этой модели/таблицы? У меня есть две миграции для этой модели: timestamp_create_modelname и имя_домена_домена_домена.

Также будет ли этот метод обновлять файл db/schema.rb?

Когда я нажимаю приложение на Heroku, я подозреваю, что модель будет удалена, но таблица останется на месте, есть ли команда heroku для удаления таблицы.

Метод второй

Еще один способ, которым я читал, - создать новую миграцию, чтобы удалить таблицу, а затем уничтожить модель.

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

Кажется, это лучший метод, но что происходит с более старыми файлами миграции? Будут ли они оставаться и обновлять db/shema каждый раз, когда я запускаю rake db: migrate только для переопределения db/migrate/timestamp_drop_tablename?

Я счастлив поэкспериментировать со вторым методом, но хотел бы, чтобы кто-то с кем-то, у кого был опыт, взвесил и сказал мне, что это рельсы для этого.

Ответ 1

Второй метод - это идеальный способ справиться с этим: ваши файлы миграции предназначены для представления того, как ваша база данных со временем изменилась. Более старые файлы миграции останутся в вашем проекте (в случае, предположительно, вы хотели бы вернуться к старой версии), но Rails не будет запускать их, когда вы rake db:migrate, потому что он знает, что они уже запущены (на основе данных в таблице schema_migrations базы данных).

Ваш schema.rb будет обновляться только один раз, чтобы отразить, что ваша база данных больше не содержит эту таблицу.

Небольшая настройка вашего кода: ваш файл миграции должен опустить таблицу в методе up и в идеале воссоздать ее в методе down. "Вверх" означает, что ваш перенос приводит к тому, что таблица перемещается вперед вовремя, а если перенос отменяется, будет запущен метод down.

Ответ 2

Я знаю, что это старый поток. Чаще всего вы хотите удалить не только модель, но и маршруты, контроллер и представления, связанные с этой моделью. Для этого запустите эти

rails g migration DropYourModel
rails destroy scaffold YourModelName

Измените файл миграции на drop_table, а затем запустите

rake db:migrate

Если модель определена в пространстве имен, например, admins, замените первую команду

rails destroy scaffold admins/YourModelName