ActiveRecord:: Base#find не возвращает записей в Единственном наследовании таблицы (STI)

приложение/модели

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

1
задан sfsn 9 August 2010 в 03:55
поделиться

1 ответ

Из-за способа построения ActiveRecord STI. Когда класс загружается, он регистрируется у своего родителя (см. Ловушку #inherited ). Таким образом, когда вы вызываете Amodel # find или Bmodel # find, если подкласс не известен, он еще не может быть найден.

В производственной среде эта проблема не будет очевидна, потому что Rails будет загружать все модели при запуске, предотвращая подобные проблемы.

2
ответ дан 2 September 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: