Rails STI和多级继承查询

时间:2015-10-08 03:25:20

标签: ruby-on-rails ruby activerecord single-table-inheritance

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

class Person < ActiveRecord::Base
end

class Member < Person
end

class Business < Member
end

Demonstration of the problem

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

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

2 个答案:

答案 0 :(得分:3)

默认情况下,Rails并不急于在开发中加载您的类。尝试更改config/environments/development.rb中的以下行:

# Do not eager load code on boot.
config.eager_load = false

为:

# Do eager load code on boot!
config.eager_load = true

答案 1 :(得分:3)

这是故意行为 - Autoloading and Reloading Constants上的官方Rails指南在Autoloading and STI部分中解释得非常好:

  

...

     

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

# app/models/polygon.rb
class Polygon < ApplicationRecord
end
require_dependency 'square'
     

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

因此,在您的情况下,这意味着将require_dependency "business"放在Person类的末尾。

但是,要注意使用require而不是require_dependency可以避免的循环依赖(尽管它可能会禁止Rails在进行更改时跟踪和重新加载文件 - 毕竟,{ {1}}是一种Rails内部方法。)