Ruby On Rails - новая миграция и изменение модели, вызывающее сбой миграции - PullRequest
0 голосов
/ 26 сентября 2018

Я создал новую миграцию для добавления новой таблицы.Давайте назовем его new_items, который создает новую таблицу.

в процессе миграции, я указал, что отношения с другой таблицей

t.belongs_to :parent

В моей модели

class NewItem < ApplicationRecord
belongs_to :parent

class Parent < ApplicationRecord
has_many :new_items, :dependent => :destroy

Таким образом, когда я запускаю всю миграцию с нуля, в более ранней миграции произошел сбой "не удалось найти таблицу 'new_items'" в неудачной миграции, это строка, в которой и заключается проблема

def up
 Parent.where(name: "TestName").destroy_all
end

что-то не так с моей родительской моделью, так как, когда я удаляю эту следующую строку, она запускается до конца

has_many :new_items, :dependent => :destroy

Я знаю, что проблема связана с отношениями между Родителем и NewItem, но не знаю, как ее лучше исправить.

Я могу понять, почему это происходит, но не знаю, как ее решить, сохраняя при этом связь между таблицами

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Не следует использовать модели ActiveRecord при миграции.ActiveRecord не нравится, когда класс и схема Ruby не совпадают.И это может произойти, если необходимо выполнить многократную миграцию.

Я предлагаю использовать только SQL-запросы при миграции.

def up
  execute <<-SQL
    DELETE FROM parent WHERE name = "TestName";
  SQL
end
0 голосов
/ 26 сентября 2018

Всякий раз, когда вы используете ваши модели ActiveRecord в миграциях, имеет смысл определять их в рамках этих миграций, поэтому любые изменения в ваших моделях в будущем не сломают старые миграции.

class Parent < ApplicationRecord; end

или в лучшем случаеКстати, если вашему классу не нужно ничего делать

Parent = Class.new(ApplicationRecord)

, добавленное в ваш класс миграции, это должно решить вашу проблему.

Примечание: если вы просто хотите удалить все записи из таблицы parents, было бы лучше позвонить по номеру Parent.delete_all в вашей миграции.Это также решило бы проблему, но хорошая практика - добавлять модели в миграции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...