迁移到STI时迁移中的表名称

时间:2017-05-22 17:42:02

标签: ruby-on-rails activerecord sti

前段时间我意识到我们需要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

但接下来我需要将lionshorses表中的所有员工都安排到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,这样可以做我需要的,但看起来很难看。

有没有办法实现这个更优雅?

0 个答案:

没有答案