2011-02-05 4 views
0

아래의 코드를 사용하여 활성 레코드를 확장하여 주문 클래스를 조금 더 깨끗하게 만듭니다. 그러나 그것은 작동하지 않습니다. 반면에 나는 추상 기본 클래스 OrderBase을 만드는 경우ActiveRecord :: Base 확장이 작동하지 않습니다.

으로 environment.rb에서
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 

나는

require "#{Rails.root}/lib/active_record_extensions.rb" 

와 위의 확장을 필요로하고 대신 예상대로 작동하는지에서의 내 주문 클래스 상속을하자 . 내 원숭이 패치를 "가져 가려면"무엇을해야합니까?

EDIT : 내가 has_statuses에 대해 누락 된 메서드를 말하는 메시지가 나타납니다.

는 EDIT2 : 위의 코드는 콘솔에서 작동는 (C 레일)하지만 테스트에서 작동하지 않습니다

EDIT3 : 나는 = 거짓 그가 보인다 config.cache_classes에 환경/test.rb을 변경 속임수를 써라. 분명히 배워야 할 것이 많습니다 :)

+0

이 실제로 나를 위해 작동의 상단에 필요로 추가 : 여기 ActiveRecord::Base 확장 내 작업입니까? – seeingidog

+0

클래스를 깨끗하게 유지하기 위해 has_statuses : created, : in_progress, : 등의 Order 클래스에서 사용하려고합니다. – mhenrixon

+0

@ tourismidog err 이제 나에게도 효과가있다. 그리고 나는 무엇이 다른지 전혀 모른다. ... 나는 분명히 무엇인가했으나 무엇을 모르는지 모른다. 그것이 작동해야한다고 대답을 게시하고 그 대답으로 표시 할 것입니다! – mhenrixon

답변

0

내가 어떻게이 방법을 사용하고, (가) 내 주문 클래스

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

어디서 확장 코드를 저장합니까? 나는 중요한 Rails 클래스에 대한 확장이 "config/initializers /"디렉토리에서 제대로 작동하지 않는다는 것을 발견했다. "config/environment.rb"의 끝 (이것은별로 좋지 않습니다. 왜냐하면 정말 지저분 해지기 때문입니다). 나는 결코 이유를 알지 못했습니다.

당신이 레일 3에 있다면,이 더 이상 적용되지 않을 수 있도록 내가 레일 2.3.8에있어 ...

편집

:

내가이 걸렸다 다른 트릭을 잊었다 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 
+0

덕분에, 나는 또한 environment.rb의 끝에 코드를 포함 시키려고했지만 같은 결과를 얻는다. 방법이 없습니다 : ( – mhenrixon

+0

@mhenrixon Oho! 잠깐! 내 ActiveRecord :: Base 확장 기능을 사용하기 위해해야 ​​할 일을 잊어 버렸습니다! 내 답변에 1 분을 걸어 주겠다. –

+0

이렇게하면 예상치 못한 문제에 대해 불평을하는 상황에 빠지게됩니다. – mhenrixon

관련 문제