我想在不调用单表继承(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.
的异常,我怎么能这样做呢?
关于如何做到这一点的任何想法?
答案 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