Rails inheritance_column迁移

时间:2016-10-08 16:24:15

标签: ruby-on-rails postgresql rails-activerecord

我正在更改现有应用中使用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等?

1 个答案:

答案 0 :(得分:1)

在迁移中使用模型通常是一个坏主意,因为模型类假设他们知道数据库结构是什么,但迁移旨在操纵数据库结构。您的错误消息只是模型类与数据库不同步的一种情况。只要Story.all尝试实例化模型,就会得到ActiveRecord::SubclassNotFound STI异常,因为ActiveRecord希望在story_type中找到类名,但您仍然在{{1}中使用旧的字符串类型在您的数据库修复之前,您无法使用模型修复数据库。

我建议您假装您的模型在迁移过程中根本不存在,如果您直接使用数据库,那么您将有更好的时间。您只有两个story_type值,因此SQL非常简单:

story_type

只有两个值,你知道它们是什么,所以不要浪费时间试图变得聪明。