我正在更改现有应用中使用STI扩展的基本模型的public Plugin load(String pluginName, String pluginClassName) {
String name = "ru.sberbank.school.homework8." + pluginName + "." + pluginClassName;
值。如何编写迁移以使现有列符合新的inheritance_column
?
这是我的第一次尝试:
inheritance_column
然而,这失败了:
ActiveRecord :: SubclassNotFound:单表继承机制 找不到子类:'clean_slate'。提出此错误 因为列'story_type'保留用于存储类 继承的情况。如果您不打算,请重命名此列 用于存储继承类或覆盖 Story.inheritance_column使用另一列来获取该信息。
是否有直接的方法通过ActiveRecord执行此操作,还是需要使用临时列,SQL等?
答案 0 :(得分:1)
在迁移中使用模型通常是一个坏主意,因为模型类假设他们知道数据库结构是什么,但迁移旨在操纵数据库结构。您的错误消息只是模型类与数据库不同步的一种情况。只要Story.all
尝试实例化模型,就会得到ActiveRecord::SubclassNotFound
STI异常,因为ActiveRecord希望在story_type
中找到类名,但您仍然在{{1}中使用旧的字符串类型在您的数据库修复之前,您无法使用模型修复数据库。
我建议您假装您的模型在迁移过程中根本不存在,如果您直接使用数据库,那么您将有更好的时间。您只有两个story_type
值,因此SQL非常简单:
story_type
只有两个值,你知道它们是什么,所以不要浪费时间试图变得聪明。