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

一种解决方案是在 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 回答