单表inheritance查找问题

我有以下3个rails类,它们都存储在一个表中,使用rails的单表inheritance。

class Template < ActiveRecord::Base class ThingTemplate < Template class StockThingTemplate < ThingTemplate 

如果我有一个ID为150StockThingTemplate ,那么我应该在逻辑上能够这样做:

 ThingTemplate.find(150) => #returns me the StockThingTemplate 

事实上,这有效

当它工作时,它会生成以下SQL查询:

 SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) ) 

如果它不起作用,它会生成以下SQL查询:

 SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') ) 

sql正在做它应该做的事情,但问题是,为什么它一次生成一组SQL,另一次生成另一组。 它实际上是完全相同的代码。

笔记:

  • 我在轨道上1.2
  • 我已经在各个地方尝试过require 'stock_thing_template' 。 它要么没有效果,要么导致其他问题

好。 事实certificate这是因为rails不会一直看到整个inheritance层次结构。 当它在每个请求上重新加载所有项目时,这解释了不一致的行为(在某些地方,before_filter可能导致模型加载,在其他地方可能没有)。

它可以通过推杆固定

 require_dependency 'stock_thing_template' 

在所有引用这些东西的控制器的顶部。

有关rails wiki的更多信息 – 请转到页面底部