我将一个类方法混合到我的所有模型中。在计算模型类时调用该方法。不幸的是(对我来说),只要模型在开发环境中需要,这似乎是按需的。怎么可以让铁轨在启动时加载所有型号?这是否可取?
class Foo < ActiveRecord::Base
include Acl
register_acl # i need this to be called for all models at start up
end
基本上,register_acl接受一些模型想要访问控制的“动作”参数。假设Foo的一个动作是“管理”,系统需要在启动时意识到这个动作。我认为在模型中是拥有这种逻辑的最自然的地方。
谢谢你!答案 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对象就会调用它。
但是,如果您需要模型来执行某些代码本身,您很可能会面临一些代码异味,并且您需要在应用程序中更改某些内容。