说我有使用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基类。
答案 0 :(得分:2)
Myclass.all.map{|e| e.becomes(Myclass)}
将为Myclass类的对象提供类型属性。