前段时间我意识到我们需要STI而不是我们使用的架构。所以现在我已经开始迁移我们的应用程序并面临几个问题。 让我们假设我们有这样的模式(它有点复杂,但这没关系):
class Animal < ActiveRecord::Base
...
end
class Lion < ActiveRecord::Base
...
end
class Horse < ActiveRecord::Base
..
end
因此,在应用STI后,它显然看起来像这样
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)首先编写并运行迁移,然后更改模型中的代码。但这不适用于暂存,生产甚至是其他开发人员的计算机,因为首先会从repo中检索所有代码更改,然后所有迁移都将运行...
2)在迁移文件而不是Lion.find_each
中,我可以编写Lion.find_by_sql("select * from lions").each
,这样可以做我需要的,但看起来很难看。
有没有办法实现这个更优雅?