Rails - 使用没有STI的类型列?

时间:2011-08-20 20:41:08

标签: ruby-on-rails ruby-on-rails-3 single-table-inheritance

我想在不调用单表继承(STI)的情况下使用名为type的列 - 我只希望type成为包含String的普通列。

如果没有让Rails期望我拥有单个表继承并抛出The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance.的异常,我怎么能这样做呢?

关于如何做到这一点的任何想法?

5 个答案:

答案 0 :(得分:126)

在Rails 3.1中,set_inheritance_column已被弃用,您也可以使用nil作为名称,如下所示:

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end

答案 1 :(得分:20)

您可以使用set_inheritance_column覆盖STI列名称:

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

因此,请选择一些您不会用于任何内容的列名称,并将其提供给set_inheritance_column

答案 2 :(得分:17)

我知道这个问题相当陈旧,这与您提出的问题略有不同,但每当我觉得命名列类型或something_type的冲动时,我总是这样做,我会搜索类型的同义词并使用它代替:

以下是几种选择:种类,种类,品种,类别,集合,种类,种类,订单等。

答案 3 :(得分:8)

Rails 4.x

我在 Rails 4 应用中遇到了问题,但在 Rails 4 中,set_inheritance_column方法根本不存在,所以你可以'使用它。

对我有用的解决方案是通过覆盖ActiveRecord的{​​{1}}方法来禁用单表继承,如下所示:

inheritance_column

希望它有所帮助!

答案 4 :(得分:0)

如果要对所有型号执行此操作,可以将其粘贴在初始化程序中。

ActiveSupport.on_load(:active_record) do
  class ::ActiveRecord::Base
    # disable STI to allow columns named "type"
    self.inheritance_column = :_type_disabled
  end
end