1

应用程序/模型

类 Amodel < ActiveRecord::Base
结尾

类 B 模型 < A 模型
结尾

类 C 模型 < B 模型  
结尾

分贝/迁移

create_table :amodels 做 |t|
  t.string:类型
结尾

在脚本/控制台上...

$脚本/控制台
加载开发环境(Rails 2.3.4)
>> Cmodel.create
=> #<Cmodel id: 1, type: "Cmodel">
>> Bmodel.find(:all)
=> [#<Cmodel id: 1, type: "Cmodel">]

好的,但是 Bmodel 在重新启动控制台后不返回任何记录,例如:

>> 退出
$脚本/控制台
加载开发环境(Rails 2.3.4)
>> Bmodel.find(:all)
=> []

但是,它在访问 Cmodel 后可以工作:

>> C型
=> Cmodel(id:整数,类型:字符串)
>> Bmodel.find(:all)
=> [#<Cmodel id: 1, type: "Cmodel">]

Amodel 的工作原理如下:

>> 退出
$脚本/控制台
加载开发环境(Rails 2.3.4)
>> Amodel.find(:all)
=> [#<Cmodel id: 1, type: "Cmodel">]

有谁知道它为什么会这样工作?

Rails:2.3.4
Ruby:1.8.7
操作系统:Ubuntu 9.0.4

4

1 回答 1

2

由于 ActiveRecord STI 的构建方式。当一个类被加载时,它会向它的父类注册(参见#inherited钩子)。因此,当您调用 Amodel#find 或 Bmodel#find 时,如果子类未知,则还无法找到它。

在生产中,这个问题不会很明显,因为 Rails 会在启动时加载所有模型,从而防止出现此类问题。

于 2010-08-09T17:23:20.047 回答