ActiveRecord :: Base # find не возвращает записей в наследовании одной таблицы (STI) - PullRequest
1 голос
/ 09 августа 2010

app / models

class Amodel < ActiveRecord::Base
end

class Bmodel < Amodel
end

class Cmodel < Bmodel  
end

db / migrate

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

1 Ответ

2 голосов
/ 09 августа 2010

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

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

...