我正在使用一个有点奇怪的表命名约定的遗留 Oracle 数据库,其中每个列名都以表的首字母为前缀 - 例如 policy.poli_id。
为了使这个数据库更容易使用,我有一个方法 set_column_prefix 为每个列创建访问器,并删除了前缀。IE:
# Taken from wiki.rubyonrails.org/rails/pages/howtouselegacyschemas
class << ActiveRecord::Base
def set_column_prefix(prefix)
column_names.each do |name|
next if name == primary_key
if name[/#{prefix}(.*)/e]
a = $1
define_method(a.to_sym) do
read_attribute(name)
end
define_method("#{a}=".to_sym) do |value|
write_attribute(name, value)
end
define_method("#{a}?".to_sym) do
self.send("#{name}?".to_sym)
end
end
end
end
end
这是在我的 lib/ 目录中的一个文件 (insoft.rb) 中,并且在 Rails::Initializer.run 块之后从我的 config/environment.rb 中需要。
这在开发中一直运行良好,但是当我尝试在生产模式下运行应用程序时,我的所有模型中都出现以下错误:
dgs@dgs-laptop:~/code/voyager$ RAILS_ENV=production script/server
=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1964:in `method_missing':
undefined method `set_column_prefix' for #<Class:0xb3fb81d8> (NoMethodError)
from /home/dgs/code/voyager/app/models/agent.rb:16
此错误由 config/environments/production.rb 中的 'config.cache_classes = true' 行触发。如果我将此设置为false,那么 rails 将启动,但不会缓存类。我猜这会让 rails 在运行 Initializer 块之前缓存所有模型
如果我将 'require "insoft.rb'" 移到 Rails::Initializer.run 块开始之前,则会出现错误,因为 ActiveRecord 尚未初始化:
usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant ActiveRecord (NameError)
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'
from /home/dgs/code/voyager/lib/insoft.rb:1
我应该在哪里包含这个自定义库和 set_column_prefix 方法,以便在缓存模型之前提取它,但在加载所有活动记录文件之后?
干杯
戴夫·斯迈利