【发布时间】:2011-08-14 01:28:56
【问题描述】:
我想知道如何在开发环境中强制加载模型。 (轨道 2.3.10)
当我处于测试或开发模式时,SomeProject 在使用之前永远不会启动。这是控制台的内容:
> project = Project.find(:some)
RuntimeError: Can not find 'some'
from /path/to/rails/lib/identifier.rb:23:in `class_from_key'
from /path/to/rails/lib/identifier.rb:8:in `find'
from (irb):4
> Projects::SomeProject
=> Projects::SomeProject
> project = Project.find(:some)
=> #<Projects::SomeProject:0x10810ceb8 @key="some", @full_name="Some Project">
永远不会调用identifier 方法。但是,它在生产模式下以及当我在开发模式下缓存类时确实有效。
config.cache_classes = true
但这只是消除了开发的好处。
关于确保所有子类都自动加载的好方法有什么想法吗?
代码详情
我有一个Project 课程
class Project
extend Identifier
def full_name
@full_name
end
def key
@key
end
end
这是更具体项目类的基类
class Projects::SomeProject < Project
identifier :some
def initialize
@key = 'some'
@full_name = "Some Project"
end
end
项目扩展标识符模块,该模块应自行注册子类并公开find 方法以通过键实例化:
module Identifier
def find(*args)
key = args.shift
klass = class_from_key(key)
if args.empty?
klass.new
else
klass.new args
end
end
private
def class_from_key(key)
raise "Can not find '#{key}'" unless identifiers.has_key?(key)
identifiers[key]
end
def identifiers
@@identifiers ||= {}
end
def identifier(key)
identifiers[key] = self
end
end
【问题讨论】:
标签: ruby-on-rails class