单表继承查找问题

时间:2008-10-21 02:34:43

标签: ruby-on-rails ruby inheritance

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

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

如果我的StockThingTemplate ID为150,那么我应该能够在逻辑上做到这一点:

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'。它要么没有效果,要么引起其他问题

1 个答案:

答案 0 :(得分:7)

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

可以通过添加

来修复
require_dependency 'stock_thing_template'

位于引用这些内容的所有控制器的顶部。

More info on the rails wiki - 转到页面底部