2011-09-19 2 views
2

이 내 협회 및 범위 설정입니다 :활성 레코드의 범위와 has_many 연결을 어떻게 연결할 수 있습니까?

has_many :owned_products 

has_many :owned_lessons, :through => :owned_products, :source => :lesson, :conditions => "owned_products.product_type = 'Lesson'" 

scope :active_purchase_scope, lambda { 
    where('owned_products.created_at' => (Date.today - CONFIG['downloads']['time_window'].days)..(Date.today)).order('owned_products.created_at DESC') 
} 

def active_lessons 
    owned_lessons.active_purchase_scope 
end 

이다 오류 내가 얻을 :

ruby-1.8.7-p334 :005 > User.find_by_username('joeblow').active_lessons 
NoMethodError: undefined method `active_purchase_scope' for #<User:0x1051a26c8> 

답변

4

scope는 클래스의 방법으로 처리 할 수 ​​있고 association이 될 수 있습니다 인스턴스 메서드로 처리됩니다. 코드 샘플에서 owned_lessons 메서드는 배열 객체를 반환합니다. 모델 개체 클래스 (즉, User.active_purchase_scope)에서만 범위를 호출 할 수 있으므로 active_purchase_scope을 배열 개체 (또는 해당되는 경우 User 개체)에 호출 할 수 없습니다.

범위를 추가하여이 문제를 해결할 수 있습니다. Lesson 모델

class Lesson 
    has_many :owned_products 

    scope :active_purchase_scope, lambda { 
    include(::owned_products).where('owned_products.created_at' => 
      (Date.today - CONFIG['downloads']['time_window'].days)..(Date.today)). 
      order('owned_products.created_at DESC') 
    } 

end 

그리고 다시 사용자 클래스는 다음과 같이

class User 

    has_many :owned_products 

    has_many :owned_lessons, :through => :owned_products, :source => :lesson, 
       :conditions => "owned_products.product_type = 'Lesson'" 


    def active_lessons 
    owned_lessons.active_purchase_scope 
    end 

end 

owned_lessonsLesson 모델에 익명의 범위를 반환, 따라서 우리는의와 함께 체인 수 동일 모델의 active_purchase_scope 대담하게.

+0

필자는 Array 클래스로 인해 이것이 작동하지 않는 이유를 이해했지만 active_purchase_scope을 추상화하는 방법을 아직 모르고 있습니다. 모든 제품에서 단원뿐 아니라 이것을 사용해야하기 때문입니다. 현재 제품 모델은 어떤 것도 상속받지 않습니다. 모든 제품이 상속하는 제품 모델을 만들어야합니까 (이 작업은 실제로 혼란 스러울 수 있습니다. 즉, 조인 테이블에 product_id가 있습니다) 또는 mixin을 통해 동일한 작업을 수행 할 수 있습니까? – pixelearth

관련 문제