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

Kva*_*ass 77 ruby-on-rails single-table-inheritance ruby-on-rails-3

我想使用一个名为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.呢?

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

Val*_*cev 127

在Rails 3.1 set_inheritance_column中不推荐使用,你也可以使用它nil作为名称,如下所示:

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end
Run Code Online (Sandbox Code Playgroud)

  • @Batkins移动`inheritance_column`阅读器(因此"弃用或移动"通知).直接设置`inheritance_column`实例变量的用法是打算使用的,不会弃用. (2认同)

mu *_*ort 20

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

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为Rails/Ruby更喜欢约定优于配置,因此他们尝试针对他们认为正确的用例优化它. (9认同)
  • @Jon:Rails并不真正关心遗留数据或与其他人玩得很好,Rails对此持太多态度.你可以通过一些努力让它表现得很好但是如果你需要做一些Rails没有计划的事情(不幸的是包括许多基本的数据库概念),你总是会打架.OTOH,我是一个专业的异教徒,所以其他Rails人肯定会因为指出意识形态问题而烦恼:) (4认同)
  • 我需要在我的数据库中实际创建所述列吗? (2认同)
  • @Kvass:我不这么认为. (2认同)

rii*_*rii 20

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

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


Ita*_*dev 8

Rails 4.x

我在Rails 4应用程序中遇到了问题,但在Rails 4中,set_inheritance_column方法根本不存在,因此您无法使用它.

为我工作的解决方案是通过覆盖禁用单表继承ActiveRecordinheritance_column方法,就像这样:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 更简单的版本:`class MyModel <ActiveRecord :: Base``self.inheritance_column = nil``end`.参考:http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/inheritance_column (5认同)
  • 我不明白你的反应,我只是想给你的答案一个有用的补充。你为什么觉得被冒犯了?我平安而来 (2认同)
  • @Benj 看起来他们删除了您所指的任何评论,所以现在看起来您只是在与自己争论。;) (2认同)