【问题标题】:Dynamically eager-loading STI classes动态预加载 STI 类
【发布时间】:2012-07-04 00:46:40
【问题描述】:

场景:我的 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 模型?

【问题讨论】:

    标签: ruby-on-rails eager-loading single-table-inheritance


    【解决方案1】:

    我找到了解决办法...:

    # in development.rb
    ActionDispatch::Reloader.to_prepare do
      Rails.application.eager_load!
    end
    

    【讨论】:

    • 在生产中,类在开头缓存
    【解决方案2】:

    一种解决方案是在 ApplicationController 上创建一个过滤器:

    class ApplicationController < ActionController::Base
      before_filter :reload_sti_classes if Rails.env.development?
    
      def reload_sti_classes
        [ParentObject, ChildObject]
      end
    end
    

    不过我觉得不太合适。

    【讨论】:

    • 您找到更好的解决方案了吗?
    • 不是真的,我没怎么追求。
    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2023-01-21
    • 2011-04-04
    相关资源
    最近更新 更多