Подтвердить что ты не робот

Rails 3 загружает все модели при запуске

У меня есть метод класса, смешанный со всеми моими моделями. метод вызывается при оценке класса модели. к сожалению (для меня), это, по-видимому, по запросу, когда модель нужна в разработке env. как могут быть загружены все модели при запуске? это даже целесообразно?

class Foo < ActiveRecord::Base
  include Acl
  register_acl # i need this to be called for all models at start up
end

В принципе, register_acl принимает несколько аргументов "действий", которые хотели бы контролировать модель. Предположим, что одно из действий Foo "управляется", и система должна знать об этом при запуске. Я думаю, что в модели наиболее естественным местом для этой логики.

Благодарю вас!

4b9b3361

Ответ 1

Правильный способ сделать это для всего приложения - включить cache_classes в вашей конфигурации. По умолчанию он отключен в разработке, но включен в производство.

Если вы хотите сделать это спорадически:

Rails.application.eager_load!

Ответ 2

Я не знаю, идеально ли это, но это работает для меня. Где-то в config/initialize/, я делаю это:

Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| require_dependency file }

и что предварительно загружает мои модели

Ответ 3

В концептуальных моделях MVC не предполагается действовать самостоятельно, то есть они должны действовать только тогда, когда контроллер отправляет им сообщение (например, @foo.register_acl). Типичные экземпляры даже не должны существовать до тех пор, пока они не будут созданы контроллером.

Чего вы пытаетесь достичь с помощью метода register_acl?

Если вам действительно нужно что-то, что нужно выполнить при создании объекта, вы можете использовать метод initialize(), который вызывается всякий раз, когда создается объект Ruby.

Однако, если вам нужна модель для выполнения некоторого кода, вы, скорее всего, столкнетесь с каким-то запахом кода, и вам нужно что-то изменить в своем приложении.