3

次の 3 つの Rails クラスがあり、これらはすべて Rails の単一テーブル継承を使用して 1 つのテーブルに格納されています。

class Template < ActiveRecord::Base
class ThingTemplate < Template
class StockThingTemplate < ThingTemplate

StockThingTemplateのIDを持っている場合、150論理的にこれを行うことができるはずです:

ThingTemplate.find(150)
=> #returns me the StockThingTemplate

実際、これはうまくいきます。

動作すると、次の SQL クエリが生成されます。

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) )

機能しない場合は、次の SQL クエリが生成されます。

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') )

SQLは想定どおりに機能していますが、問題は、あるSQLセットを一度生成し、別のセットを別のセットで生成するのはなぜですか。文字通りまったく同じコードです。

ノート:

  • 私はレール1.2に乗っています
  • すでにいろいろなところで試していrequire 'stock_thing_template'ます。効果がないか、他の問題を引き起こします
4

1 に答える 1

7

わかった。これは、Rails が常に継承階層全体を認識していないためです。リクエストごとにすべてのアイテムをリロードするため、一貫性のない動作が説明されます (場所によっては before_filter によってモデルが読み込まれる可能性があり、他の場所では読み込まれない可能性があります)。

入れることで固定できます

require_dependency 'stock_thing_template'

それらのものを参照するすべてのコントローラーの上部にあります。

Rails wiki の詳細- ページの下部に移動します。

于 2008-10-21T02:53:08.690 に答える