我尝试使用下面的代码来扩展活动记录,以使我的订单类更清洁。但它不起作用。
class ActiveRecord::Base
def self.has_statuses(*status_names)
validates :status,
:presence => true,
:inclusion => { :in => status_names}
status_names.each do |status_name|
scope "all_#{status_name}", where(:status => status_name)
end
status_names.each do |status_name|
define_method "#{status_name}?" do
status == status_name
end
end
end
end
在environment.rb中我需要上面的扩展名
require "#{Rails.root}/lib/active_record_extensions.rb"
另一方面,如果我创建一个抽象基类OrderBase,让我的订单类继承它,而不是按预期工作。我需要做些什么来让我的猴子补丁“拿走”?
编辑:忘了提及我收到一条消息,说明has_statuses缺少方法。
EDIT2:以上代码在控制台(rails c)中有效,但在测试中不起作用
EDIT3:我将环境/ test.rb更改为config.cache_classes = false,这似乎可以解决问题。显然有很多东西需要学习:)
答案 0 :(得分:0)
您在哪里存储该扩展程序代码?我发现重要的Rails类的扩展不能在“config / initializers /”目录中工作(我希望保留它们,为了整洁),但是如果我在“config / environment.rb”的结尾(我完全不喜欢它,因为它很快就会变得混乱)。我从来没有想过为什么。
我使用的是Rails 2.3.8,所以如果您使用的是Rails 3,则可能不再适用...
修改强>
我忘记了使ActiveRecord::Base
扩展工作所需的另一个技巧 - 方法(类方法,至少 - 我没有用实例方法完成)必须在中声明元类(我认为这就是所谓的......)。这是我工作的ActiveRecord::Base
扩展程序:
ActiveRecord::Base.class_eval do
class << self
def find_with_benchmark(*args)
bg = Time.now
ret = find_without_benchmark(*args)
MyLogger.ar_time += Time.now - bg
MyLogger.ar_count += 1
return ret
end
alias_method_chain :find, :benchmark
end
end
答案 1 :(得分:0)
我将需求添加到订单类的顶部
require "#{Rails.root}/lib/active_record_extensions.rb"
class Order < ActiveRecord::Base