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


81

我想使用type不调用单表继承(STI)的列-我只想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.

有关如何执行此操作的任何想法?

Answers:


134

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

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

实际上,似乎发生了变化rails 3.2。根据apidock的说法:“此方法已在最新的稳定版本上弃用或移动。这里显示了最新的现有版本(v3.1.0)。谢谢你的小费!
巴特金斯2012年

它是在3.1过时和3.2移除,我想
瓦伦丁Nemcev

2
@Batkinsinheritance_column读取器已移动(因此“已弃用或移动”通知)。inheritance_column直接设置实例变量的用途是有意的,不建议使用。
lulalala 2013年

在5.1轨道上工作
John Bachir

21

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

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

因此,选择一些不用的列名,然后将其输入set_inheritance_column


2
我是否需要在数据库中实际创建所述列?
克瓦斯,

谢谢你,这个工作。框架永远不应该!!!!永远!!!规定不能命名的表字段。对于传统数据集而言,这太糟糕了。
2012年

5
@Jon:Rails并不真正在乎遗留数据或与其他人打交道,Rails对此态度太高。您可以花点力气使其表现出来,但是如果您需要做一些Rails尚未计划的事情(不幸的是,它包含了许多基本的数据库概念),您总是会费劲一点。太太,我是一个专业的异端,所以其他Rails人士一定会因指出思想上的问题而对我感到不高兴:)
mu太短

10
我认为这个想法是Rails / Ruby比配置更喜欢约定,因此他们尝试针对自己认为正确的用例对其进行优化。
易卜拉欣

21

我知道这个问题已经很老了,并且与您要提出的问题有所不同,但是当我想命名列类型或something_type的冲动时,我总是会做的是寻找类型的同义词并改用它:

这里有一些选择:种类,种类,种类,类别,集合,体裁,种类,顺序等。


10

Rails 4.x

我在一个Rails 4应用程序中遇到了问题,但是在Rails 4中set_inheritance_column方法根本不存在,所以您不能使用它。

对我有用的解决方案是通过重写ActiveRecordinheritance_column方法来禁用单表继承,如下所示:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

希望能帮助到你!


8
较简单的版本:class MyModel < ActiveRecord::Base self.inheritance_column = nil end。参考:apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/...
BENJ

1
在4.2.2中为我工作。也许您没有重新启动服务器,或者在进行更改后没有弹簧?
2015年

1
我评论过的简单版本可能对其他用户有用。至于重载问题,我不是专家,但是对我来说,让类属性在不卸载和重载类定义的情况下不会自动重载是有意义的。
2015年

2
我不理解您的反应,我只是想为您的答案提供有用的补充。为什么感到生气?我和平相处
Benj 2015年

2
@Benj看来他们删除了您所指的任何评论,因此现在看来您在和自己争论。;)
约书亚·品特

0

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

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

或者更好-在ApplicationRecord中
亚历山大
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.