2013-08-30 4 views
0

Я хочу уничтожить следующую модель:Уничтожение модели в Rails

class Job < ActiveRecord::Base 
    has_many :items 
    validates :name, presence: true, uniqueness: true 
end 

Это товара Модель

class Item < ActiveRecord::Base 
    belongs_to :department 
    belongs_to :job 
    belongs_to :category 
    validates :name, presence: true, uniqueness: true 
end 

Я знаю, что я собираюсь использовать rails d model Job

но как удалить столбец job_id в модели Item? это db:rollback? и как убедиться, что все чистое? Что еще мне делать?

+0

Вы записали миграцию, чтобы создать столбец job_id? – Raghu

+0

Нет, что было создано с самого начала, когда я создал модель со своими отношениями, будет ли она автоматически удалена? – nevermind

+0

Тогда у вас есть запись миграции, чтобы избавиться от этой строки, как показано в ответе от @zeantsoi – Raghu

ответ

2

Мы не можем сообщить из предоставленной информации, можно ли просто запустить миграцию вниз, чтобы удалить столбец job_id, так как он может быть разрушительным для других столбцов. Тем не менее, вы можете создать новую миграцию, которая явно удаляет job_id столбца:

# from command line 
rails g migration RemoveJobIdFromItems 

Укажите колонку для удаления в таблице:

def up 
    remove_column :items, :job_id 
end 

В случае, если вы хотите повторно добавить миграцию, создать вниз миграции, что откатывает удаление:

def down 
    add_column :items, :job_id, :integer 
end 

rake db:migrate Затем запустите из командной строки. Столбец будет удален из таблицы items.

Наконец, вы хотите, чтобы убедиться, что вы удалили связь с вашей модели:

# app/models/item.rb 
class Item < ActiveRecord::Base 
    belongs_to :department 
    belongs_to :category 
    validates :name, presence: true, uniqueness: true 
end 
+0

Я сделал все это, спасибо! почему бы не разрушить модель, чтобы вы не удалили модель, которая имеет отношения? – nevermind

+0

Это _does_ разрушает модель, но она не разрушает отношения в вашей связанной модели. Эта ассоциация создается и удаляется вручную. – zeantsoi

0

Если это только вы, и вы можете жить без данных в таблице Item, затем:

  • запустить rake db:rollback дважды, чтобы удалить как задание и элемент таблицы
  • запустить rails d model Job удалить модель работы и миграции
  • редактировать файл Пункт миграции вручную удалить belongs_to :job линии
  • и, наконец, rake db:migrate, чтобы получить вещи обратно к нормальному

При работе с группой, вы не знаете, если они уже бежали миграции, которые добавили job_id , так что это безопаснее:

  • запустить rails g migration remove_job_id_from_items job_id:integer создать миграцию, которая удаляет job_id из таблицы элементов
  • выполнения rails g migration drop_items_table удалить таблицу и редактировать эту миграцию, чтобы добавить drop_table :job в блок изменений (см. Примечание ниже)
  • запустите rake db:migrate, чтобы выполнить эти две миграции, которые вы только что создали.
  • и, наконец, запустить rails d model Job --skip-migration уничтожить модель, но оставить первоначальную миграцию

Когда вы делаете это так, как Миграции остаться в проекте навсегда, но компенсируют друг друга. В git мы пытаемся двигаться только вперед.

(примечание: это может создать «необратимые миграции», и может быть лучше, чтобы сделать этот шаг.)

0

Предполагая, что вы также положить индекс на вашу JOB_ID колонке, вы будете хотеть удалите это, прежде чем удалять столбец. Также, если вы используете rails 3.1+, вы можете пропустить методы вверх и вниз и просто использовать метод изменения на чем-то просто таком, иначе я бы полностью согласился с zeantsoi. Для вашей миграции:

def change 
    remove_index :items, :job_id 
    remove_column :items, :job_id 
end 

Кроме того, если ваша колонка не имеет индекса: укажите свои внешние ключи.

0

Вы можете создать миграцию, которая удалит проиндексированный job_id. Никаких изменений файла миграции вручную не требуется. Просто:

rails g migration RemoveJobRefFromItems job:references 
Смежные вопросы