STI数据迁移之self.inheritance_column

场景:

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

1
2
3
4
5
6
7
8
9
### 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:

1
2
3
4
5
6
7
8
9
10
11
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

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

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

解决方法

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

1
2
3
4
5
6
7
8
9
10
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