Имена таблиц в миграциях при переходе на STI

Некоторое время назад я понял, что нам нужна STI вместо схемы, которую мы использовали. Так что теперь я начал переносить наше приложение и столкнулся с несколькими проблемами. Давайте представим, что у нас была такая схема (она немного сложнее, но это не имеет значения):

class Animal < ActiveRecord::Base
  ...
end

class Lion < ActiveRecord::Base
  ...
end

class Horse < ActiveRecord::Base
 ..
end

Итак, после применения ИППП это выглядит, очевидно, так

class Animal < ActiveRecord::Base
  ...
end

class Lion < Animal
  ...
end

class Horse < Animal
 ..
end

Но тогда мне нужно поставить всех сотрудников из lions а также horses таблицы в animals,

Итак, я написал такую ​​миграцию:

  def change
    Lion.find_each do |l|
      Animal.create(
        name: l.name,
        type: 'Lion'
        )
    end
  end

и это не сработало. Потому что при выполнении Lion.find_each он уже получает данные из Animals с Lion тип. Я нашел два способа решения этой проблемы:

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

2) В файле миграции вместо Lion.find_each я могу написать Lion.find_by_sql("select * from lions").each и это будет делать то, что мне нужно, но выглядит ужасно.

Есть ли способ реализовать это более элегантно?

0 ответов

Другие вопросы по тегам