如何仅使用基本STI类加载STI记录?

时间:2019-06-25 23:41:11

标签: ruby-on-rails ruby activerecord

说我有使用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次是一件好事,但是是否可以将这些记录加载到它们的基类中,而不是在type列中加载该类?例如

MyBase.first.class
# => MyBase

我希望有一种方法可以在AR查询中将其关闭,例如MyBase.where(condition: :something, use_base: true) ...

我的用例是,我使用的是gem,希望我通过它传递AR关系,查看class.name,并在获取STI子类时中断。为了避免修补该宝石,我想遵守其限制,并向其传递一个关系,该关系的记录的类在加载时将自动强制为STI基类。

1 个答案:

答案 0 :(得分:2)

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

将为Myclass类的对象提供类型属性。