приложение/модели
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">]
Кто-либо знает, почему это работает как это?
Направляющие: 2.3.4
Ruby: 1.8.7
ОС: Ubuntu 9.0.4
Из-за способа построения ActiveRecord STI. Когда класс загружается, он регистрируется у своего родителя (см. Ловушку #inherited ). Таким образом, когда вы вызываете Amodel # find или Bmodel # find, если подкласс не известен, он еще не может быть найден.
В производственной среде эта проблема не будет очевидна, потому что Rails будет загружать все модели при запуске, предотвращая подобные проблемы.