应用程序/模型
class Amodel < ActiveRecord::Base end class Bmodel < Amodel end class Cmodel < Bmodel end
分贝/迁移
create_table :amodels do |t| t.string :type end
在脚本/控制台上......
$ script/console Loading development environment (Rails 2.3.4) >> Cmodel.create => #<Cmodel id: 1, type: "Cmodel"> >> Bmodel.find(:all) => [#<Cmodel id: 1, type: "Cmodel">]
好的,但是Bmodel在重启控制台之后没有返回任何记录,如:
>> exit $ script/console Loading development environment (Rails 2.3.4) >> Bmodel.find(:all) => []
但是,它在访问Cmodel之后有效:
>> Cmodel => Cmodel(id: integer, type: string) >> Bmodel.find(:all) => [#<Cmodel id: 1, type: "Cmodel">]
Amodel的工作方式如下:
>> exit $ script/console Loading development environment (Rails 2.3.4) >> Amodel.find(:all) => [#<Cmodel id: 1, type: "Cmodel">]
有谁知道它为什么会这样?
Rails:2.3.4
Ruby:1.8.7
操作系统:Ubuntu 9.0.4
答案 0 :(得分:2)
由于ActiveRecord STI的构建方式。加载类时,它会向其父级注册(请参阅#inherited挂钩)。因此,当你调用Amodel#find或Bmodel#find时,如果子类未知,则无法找到它。
在生产中,这个问题不明显,因为Rails会在启动时加载所有模型,防止出现这种问题。