2011-02-05 45 views
0

我尝试使用下面的代码来扩展活动记录,让我的订单类更清洁一些。然而,它不工作。ActiveRecord :: Base Extension不工作

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:上面的代码工作在控制台(导轨C),但它并没有在测试工作

EDIT3:我改变了环境/ test.rb到config.cache_classes =假,这似乎做的伎俩。显然有很多要学习:)

+0

这实际上对我的作品的顶部,你是如何使用这种方法? – seeingidog 2011-02-05 07:23:49

+0

我想在我的Order类中使用它,如:has_statuses:created,:in_progress,:shipped等以保持类的清洁。 – mhenrixon 2011-02-05 11:20:27

回答

0

我加入了需要我的订单班

require "#{Rails.root}/lib/active_record_extensions.rb" 
class Order < ActiveRecord::Base 
0

你在哪里存储该扩展代码?我发现对于重要的Rails类的扩展不能从“config/initializers /”目录(为了整洁起见,我宁愿保留它们)工作,但是如果我在“config/environment.rb”的结尾(我根本不喜欢,因为它非常快速地变得混乱)。我从来没有想过为什么。

我on Rails的2.3.8,所以如果你是on 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 
相关问题