ActiveRecord :: Base Extension无法正常工作

时间:2011-02-05 06:36:39

标签: ruby-on-rails ruby-on-rails-3 activerecord

我尝试使用下面的代码来扩展活动记录,以使我的订单类更清洁。但它不起作用。

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,这似乎可以解决问题。显然有很多东西需要学习:)

2 个答案:

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