ruby-on-rails - Rails STI 和“类型”字段
问题描述
我遵循了一些资料来弄清楚如何在 Ruby On Rails 中实现单表继承。我使用的具体示例仅涉及 2 种类型的用户:RegularUser
并从具有几个字段的模型Admin
继承,例如. 模型中的字段之一是 User 的类型,它只是一个 String 字段。我的问题是:当我简单地在一个名为“type”的字符串字段中指定它可能只是一个与子类无关的字符串字段时,Rails 如何连接要使用的子类上的点?如果该字段按照我的想法执行,这是否意味着它是专门为 RoR 中的 STI 保留的关键字?任何指针将不胜感激。这是我的用户迁移文件(没什么特别的):User
username
User
type
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
解决方案
Rails 有一个方法可以根据类型名称推断对应的类
因此,如果在您的数据库中,您有记录
User, id: 5, type: 'user_admin'
你也是User.find(5)
Rails 将查看类型值 'user_admin' 并通过基本执行来为您恒定化正确的实例,ActiveSupport::Dependencies.constantize("user_admin")
这是一个花哨的名称,可以说给我对应于该字符串的 ruby 类。
在 Rails 中,除了促进 STI 之外,您不应该将“类型”用作列名,因此它确实是一种保留字,如果您的数据库包含任何不是 AR 类名称的内容,您的代码将会崩溃。如果要对列使用名称“类型”,则需要按照此处的说明更改继承列
推荐阅读
- angular - Angular 6 和 RxJS 6 重大变化
- java - 用模式示例替换 if else 语句
- python - Chrome 使用 selenium 启动更多驱动程序错误
- javascript - Angular/TypeScript 中的构造函数名称错误?
- c# - 移动图像并将其添加到图片框
- c - 试图在 C 中的房间结构定义中声明一个结构房间数组
- java - org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException
- python - 是否有复制 pip 库的命令/程序
- c# - 无法将 JSON 反序列化为字典
- javascript - 计算要填充的可用插槽数量