2011-02-05 63 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 
相關問題