Ruby on rails 活动记录STI

Ruby on rails 活动记录STI,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在某些情况下,STI没有发挥我认为应该发挥的作用 模型(简化): 我正在使用ActiveRecord::Associations::Preload来避免GraphQL服务器中的n+1问题。我开始出现一些STI错误 从控制台,这可以正常工作并返回FooSpec或BarSpec: Order.includes(items: :spec).first.items.first.spec 与此相同: Order.includes(:items).first.items.includes(:spec).f

在某些情况下,STI没有发挥我认为应该发挥的作用

模型(简化):

我正在使用
ActiveRecord::Associations::Preload
来避免GraphQL服务器中的n+1问题。我开始出现一些STI错误

从控制台,这可以正常工作并返回
FooSpec
BarSpec

Order.includes(items: :spec).first.items.first.spec
与此相同:

Order.includes(:items).first.items.includes(:spec).first.spec
这也是:

ActiveRecord::Associations::Preloader.new
  .preload(Order.all, :items).first.owners.first.items.first.spec
然而,这:

ActiveRecord::Associations::Preloader.new.preload(Order.all, items: :spec)
这是:

ActiveRecord::Associations::Preloader.new
  .preload(Order.all.map{|o| o.items}.flatten, :spec)
引发错误:

ActiveRecord::SubclassNotFound:单表继承机制 未能找到子类:“FooSpec”。出现此错误 因为列“type”是为存储类而保留的,以防 遗产如果您不打算将此列重命名,请将其重命名 用于存储继承类或覆盖 Spec.inheritation\u列使用另一列获取该信息

有时我会从应用程序中得到一个稍有不同的错误,但我无法在控制台中重现它:

ActiveRecord::SubclassNotFound(无效的单表继承类型: FooSpec不是Spec的子类)


嗯……正如你所看到的,
FooSpec
无疑是
Spec
的一个子类。这些错误通常意味着您使用了
类型
作为属性,并且没有告诉ActiveRecord它不是STI鉴别器。这里不是这样。想法?

我找到了罪犯。我有这个:

class FooSpec < Spec
  validates :my_field, inclusion: {in: MyClass::CHOICES}
end

我找到了罪犯。我有这个:

class FooSpec < Spec
  validates :my_field, inclusion: {in: MyClass::CHOICES}
end
class FooSpec < Spec
  validates :my_field, inclusion: {in: MyClass::CHOICES}
end
class FooSpec < Spec
  validates :my_field, inclusion: {in: -> (_instance) {MyClass::CHOICES}}
end
class MyClass < MyClassyEnum
  CHOICES = %w[
    choiceOne
    choiceTwo
  ].freeze
  ...
end