Ruby on rails 活动记录STI
在某些情况下,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
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