Rails STI和多级继承查询

Obv*_*ity 7 ruby activerecord ruby-on-rails single-table-inheritance

在我的数据库中,我有一个表people,我正在使用单表继承,这些类:

class Person < ActiveRecord::Base
end

class Member < Person
end

class Business < Member
end
Run Code Online (Sandbox Code Playgroud)

演示问题

它产生的查询让我很困惑.我想要的是Member.all返回所有企业以及会员的任何其他子类型.这是什么,但只有我最近访问过Business类.我认为这是因为我的类没有被缓存在开发模式中(出于显而易见的原因),但它仍然看起来像奇怪/错误的行为.

这是rails中的错误吗?还是按预期工作?在任何一种情况下,任何人都可以想到一个很好的发展目的吗?

Mic*_*nek 5

这是故意的行为——关于自动加载和重新加载常量的官方 Rails 指南在自动加载和 STI部分很好地解释了它:

无论执行顺序如何,确保这都能正常工作的一种方法是在定义根类的文件底部手动加载树的叶子:

# app/models/polygon.rb
class Polygon < ApplicationRecord
end
require_dependency 'square'
Run Code Online (Sandbox Code Playgroud)

只有至少是孙子的叶子需要以这种方式加载。直接子类不需要预加载。如果层次结构更深,中间类将从底部递归自动加载,因为它们的常量将作为超类出现在类定义中。

所以在你的情况下,这意味着require_dependency "business"在你的 Person 类的末尾放置一个。

但是,请注意循环依赖,这可能可以通过使用require替代来避免require_dependency(即使它可能会禁止 Rails 在进行更改时跟踪和重新加载您的文件——毕竟,这require_dependency是一个 Rails 内部方法)。