ruby-on-rails - 如何仅使用基本 STI 类加载 STI 记录?
问题描述
假设我有使用 STI 的模型,如下所示:
class MyBase < ApplicationRecord ; end
class MyBase::MySubclass1 < MyBase ; end
class MyBase::MySubclass2 < MyBase ; end
当我使用基类查找记录时,记录都与类型列中的类一起加载。
MyBase.all.to_a.map { |record| record.class.name }
# => [MyBase::MySubclass1, MyBase::MySubclass2]
100 次中有 99 次这是一件好事,但是是否可以将这些记录加载到它们的基类而不是类型列中的类中?例如
MyBase.first.class
# => MyBase
我希望有一种方法可以在 AR 查询中将其关闭,例如MyBase.where(condition: :something, use_base: true)
...
我的用例是我正在使用一个 gem,它希望我将 AR 关系传递给它,查看 class.name,并在它获得 STI 子类时中断。为了避免修补 gem,我想遵守它的限制并传递一个关系,其记录的类在加载时将自动强制转换为 STI 基类。
解决方案
Myclass.all.map{|e| e.becomes(Myclass)}
无论类型属性如何,都会给出 Myclass 类的对象。
推荐阅读
- javascript - 如何让我的 VueJA/Buefy 自动完成显示过滤选项?
- typescript - 'InputType[]' 类型的参数不可分配给'GenericType[]' Typescript 类型的参数
- fullcalendar - Fullcalendar 调度程序时间线 12 个月独特的插槽视图,带有附加列
- virtualization - 在 QEMU 上扩展 risc-v 指令
- laravel - 两个不同的 Laravel 包中的冲突 vue
- sql - 为什么这段代码没有返回正确的结果?
- null - 尝试在 H2 数据库中使用 DEFAULT NULL 设置 UNIQUE 约束时出错
- salesforce - 如何提高 Talend Cloud Jobs 的性能以连接销售人员
- android - Firefox PushManager 订阅在 Android 上不起作用
- join - 在视图上显示来自 2 个连接表单的字段值 - Lotus Notes