STI数据迁移之self.inheritance_column

场景:

数据迁移中遇到的一个问题,看个例子:

### app/models/company.rb
class Company < ActiveRecord::Base
  ……
end

### app/models/firm.rb
class Firm < Company
  ……
end

在company中,有一个字段type,按照惯例,会开启单表继承STI功能,Firm不再只是Company的一个普通的子类subclass,它与Company共享着同一个表单。

这时,需要给company添加了一个attribute,比如 creator,同时迁移数据,firm中的creator内容,需要单独调用form中的方法get_creator:

class AddCreatorToCompanies < ActiveRecord::Migration[5.2]
  class Company < ActiveRecord::Base; end

  def change
    add_column :companies, :creator, :string

    Comany.where(type: "Firm").find_each do |firm|
      firm.update(creator: firm.get_creator)
    end
  end
end

执行时,终端报错,显示:

Invalid single-table inheritance type: Firm is not a subclass of AddCreatorToCompanies::Company.

解决方法

在Company中添加 self.inheritance_column,触发单表继承STI。

class AddCreatorToComanies < ActiveRecord::Migration[5.2]
  class Company < ActiveRecord::Base
    self.inheritance_column = "_type"
  end

  def change
    add_column :companies, :creator, :string
    ……
  end
end

再次执行即可。

参考

Single table inheritance