首页 > 解决方案 > Rails STI 和“类型”字段

问题描述

我遵循了一些资料来弄清楚如何在 Ruby On Rails 中实现单表继承。我使用的具体示例仅涉及 2 种类型的用户:RegularUser并从具有几个字段的模型Admin继承,例如. 模型中的字段之一是 User 的类型,它只是一个 String 字段。我的问题是:当我简单地在一个名为“type”的字符串字段中指定它可能只是一个与子类无关的字符串字段时,Rails 如何连接要使用的子类上的点?如果该字段按照我的想法执行,这是否意味着它是专门为 RoR 中的 STI 保留的关键字?任何指针将不胜感激。这是我的用户迁移文件(没什么特别的):UserusernameUsertype

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

标签: ruby-on-railsmodelsingle-table-inheritance

解决方案


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

因此,如果在您的数据库中,您有记录

User, id: 5, type: 'user_admin'

你也是User.find(5)

Rails 将查看类型值 'user_admin' 并通过基本执行来为您恒定化正确的实例,ActiveSupport::Dependencies.constantize("user_admin") 这是一个花哨的名称,可以说给我对应于该字符串的 ruby​​ 类。

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


推荐阅读