首页 > 解决方案 > 如何仅使用基本 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 基类。

标签: ruby-on-railsrubyactiverecord

解决方案


Myclass.all.map{|e| e.becomes(Myclass)}

无论类型属性如何,都会给出 Myclass 类的对象。


推荐阅读