Динамически загружаемые классы STI

Сценарий: в моем приложении 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 я могу написать небольшой фрагмент кода, который будет перезагружать любые модели STI при каждом запросе веб-сервера?


person Henrique Zambon    schedule 04.07.2012    source источник


Ответы (2)


Я нашел решение ...:

# in development.rb
ActionDispatch::Reloader.to_prepare do
  Rails.application.eager_load!
end
person BvuRVKyUVlViVIc7    schedule 24.04.2013
comment
в производстве классы кешируются в начале - person BvuRVKyUVlViVIc7; 25.04.2013

Одно из решений - создать фильтр для ApplicationController:

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

  def reload_sti_classes
    [ParentObject, ChildObject]
  end
end

Хотя мне это кажется неправильным.

person Henrique Zambon    schedule 04.07.2012
comment
вы нашли лучшее решение? - person BvuRVKyUVlViVIc7; 16.04.2013
comment
Не совсем, я не особо этим занимался. - person Henrique Zambon; 24.04.2013