Rails STI 和“类型”字段

per*_*kle 2 model ruby-on-rails single-table-inheritance

我跟踪了一些资料来了解如何在 Ruby On Rails 中实现单表继承。我使用的具体示例只涉及两种类型的用户:RegularUser继承AdminUser具有一些字段(如username. 模型中的字段之一User是用户的类型,它只是一个字符串字段。我的问题是:当我简单地在名为“type”的字符串字段中指定子类(该字段可能只是与子类无关的字符串字段)时,Rails 如何连接要使用的子类上的点?如果该type字段的作用如我所想,这是否意味着它是 RoR 中专门为 STI 保留的关键字?任何指示将不胜感激。这是我的用户迁移文件(没什么特别的):

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :username
      t.string :email
      t.string :type

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Joe*_*lum 5

Rails有一个方法可以根据类型名推断对应的类

所以如果你的数据库中有一条记录

User, id: 5, type: 'user_admin'
Run Code Online (Sandbox Code Playgroud)

你也是User.find(5)

Rails 将查看类型值“user_admin”并通过基本上执行以下操作来为您常量化正确的实例ActiveSupport::Dependencies.constantize("user_admin") 这是一个奇特的名称,表示给我对应于该字符串的 ruby​​ 类。

在 Rails 中,除了促进 STI 之外,您不应该使用“type”作为任何列名,因此它确实是一种保留字,如果您的数据库中包含任何不是 AR 类名的内容,您的代码将会崩溃。如果您想对列使用名称“type”,您将需要更改inheritance_column,如此处所述