Rails 3 загружает все модели при запуске - PullRequest
12 голосов
/ 12 июня 2010

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

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

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

спасибо!

Ответы [ 3 ]

18 голосов
/ 23 мая 2012

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

Если вы хотите сделать это время от времени:

Rails.application.eager_load!
6 голосов
/ 22 января 2011

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

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

, и это загружает мои модели

0 голосов
/ 12 июня 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...