Rails 3在启动时加载所有模型

时间:2010-06-12 03:05:16

标签: ruby-on-rails

我将一个类方法混合到我的所有模型中。在计算模型类时调用该方法。不幸的是(对我来说),只要模型在开发环境中需要,这似乎是按需的。怎么可以让铁轨在启动时加载所有型号?这是否可取?

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 个答案:

答案 0 :(得分:18)

在应用程序范围内执行此操作的正确方法是在配置中打开cache_classes。默认情况下,它处于开发阶段但尚未投入生产。

如果你想偶尔这样做:

Rails.application.eager_load!

答案 1 :(得分:6)

我不知道这是否理想,但它对我有用。在config / initialize /的某处,我这样做:

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

并预加载我的模型

答案 2 :(得分:0)

在MVC中,概念模型并不打算单独行动,即它们只应在控制器向它们发送消息时起作用(例如,@ foo.register_acl)。模型实例甚至不应该存在,直到它们由控制器创建。

您希望使用register_acl方法实现什么目标?

如果你真的需要在对象创建时执行某些操作,你可以使用initialize()方法,只要创建一个Ruby对象就会调用它。

但是,如果您需要模型来执行某些代码本身,您很可能会面临一些代码异味,并且您需要在应用程序中更改某些内容。