Каков наилучший способ сбросить таблицу и удалить модель в 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