数据迁移中遇到的一个问题。
场景:
看个例子:
### 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
再次执行即可。