1

アプリ/モデル

class Amodel < ActiveRecord::Base
終わり

クラス Bmodel < Amodel
終わり

クラス Cモデル < Bモデル  
終わり

データベース/移行

create_table :amodels do |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">]

なぜこのように機能するのか誰か知っていますか?

レール: 2.3.4
ルビー: 1.8.7
OS: Ubuntu 9.0.4

4

1 に答える 1

2

ActiveRecord STI の構築方法のためです。クラスがロードされると、その親に登録されます ( #inheritedフックを参照)。したがって、Amodel#find または Bmodel#find を呼び出したときに、サブクラスが不明な場合は、まだ見つけることができません。

Rails は起動時にすべてのモデルをロードし、この種の問題を防止するため、本番環境ではこの問題は明らかではありません。

于 2010-08-09T17:23:20.047 に答える