Имена таблиц в миграциях при переходе на 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
и это будет делать то, что мне нужно, но выглядит ужасно.
Есть ли способ реализовать это более элегантно?