4

シナリオ: Rails 3.2 アプリに多数の STI モデルがあります。以下に示すように、親クラスを使用してデータベースに子クラスを照会することがあります。

class ParentObject < ActiveRecord::Base
end

class ChildObject < ParentObject
end

class User < ActiveRecord::Base
  has_many :parent_objects
end

> User.find(1).parent_objects
 => [#<ParentObject ...>, #<ChildObject ...>]

生成された SQL クエリを調べると、(予想どおり) 次のように表示されます。

WHERE "parent_objects"."type" IN ('ParentObject', 'ChildObject')

問題:開発環境では、変更があるとクラスが動的に再ロードされます。何かを変更しParentObjectて Rails コンソールを再起動しないと、次のようになります。

> User.find(1).parent_classes
 => [#<ParentObject ...>]

生成された SQL の検査:

WHERE "parent_objects"."type" IN ('ParentObject')

しかし:

> ChildObject
 => ChildObject(...)
> User.find(1).parent_objects
 => [#<ParentObject ...>, #<ChildObject ...>]

質問: Rails アプリのどこに、すべての Web サーバー要求で STI モデルをリロードする小さなコードを記述できますか?

4

2 に答える 2

3

私は解決策を見つけました...:

# in development.rb
ActionDispatch::Reloader.to_prepare do
  Rails.application.eager_load!
end
于 2013-04-24T21:24:14.047 に答える
0

1 つの解決策は、ApplicationController でフィルターを作成することです。

class ApplicationController < ActionController::Base
  before_filter :reload_sti_classes if Rails.env.development?

  def reload_sti_classes
    [ParentObject, ChildObject]
  end
end

しかし、それは私には正しくないようです。

于 2012-07-04T01:45:03.157 に答える