2012-07-11 2 views
0

두 개의 범위 (Rails 3.2.5)를 연결하는 간단한 문제라고 생각합니다.레일 3 범위, 합계 (합계)와 조건을 결합하여 오류가 발생합니다.

amounttransaction_date과 같은 필드가있는 Point이라는 모델이 있습니다. 사용자는 다양한 액티비티에 대해 많은 액수를 받고 사용하기 전까지는 "이용 가능"하며 액티비티의 일부로 발생합니다. 포인트는 transaction_date이며 더 이상 비어 있지 않습니다.

그래서 나는이 같은 범위가 있습니다

scope :available, where("transaction_date IS NULL OR transaction_date = ''") 

을 그리고 Point 객체의 적절한 수집을 반환, 좋은 작품. 그래서

> Point.available 
=> [#<Point id: 123, amount: 22, transaction_date: nil >][#<Point id: 456, amount: 33, transaction_date: nil >] 

을 할 수있는 그리고 내가 가능한 포인트의 합을 알고 싶다면, 나는

> Point.available.sum("amount") 
=> 55 

을 수행 할 수 있습니다하지만

scope :available, where("transaction_date IS NULL OR transaction_date = ''") 
scope :total_available, available.sum("amount") 

I와 같은 다른 영역을 만들려고하는 경우 오류가 발생합니다.

NoMethodError: undefined method `default_scoped?' for 22:Fixnum 

sum("amount").available를 그래서 범위 나는 오류

NoMethodError: undefined method `available' for 55:Fixnum 

나는 또한 :available에 정의 된 조건을 추가하여 :total_available 범위의 작업을 할 수 있습니다를 얻을 수 있지만, 매우 건조하지 않습니다.

무엇이 여기에 있습니까?

답변

5

available.sum가 바로 평가 얻는다 표현은 그래서 당신의 시도는

scope :total_available, 55 

또는

분명히 잘못
scope :total_available, 55.available 

에 해당합니다. 개인적으로 나는이 범위 컬렉션으로 범위 생각이

def self.total_available 
    available.sum(:amount) 
end 

위한 클래스 메소드를 사용하십시오 : 그것은 나에게 이해가되지 않는 범위 숫자가 될 수 있도록 - 한 가지가있을 거라고 범위를 당신이 나오지 않았어 범위가 다른 체인을

+0

감사합니다. @Frederick Chung - 오류에 대한 설명 주셔서 감사합니다. 오류를 이해하는 데 도움이됩니다. 또한 귀하의 솔루션이 실용적이며 귀하의 논리가 논리적이라고 생각합니다. 그러나 범위는 AREL 및 [여기에 문서화되어 있습니다] (http://guides.rubyonrails.org/active_record_querying.html#calculations)에서 구현되고 추가 구체화로 사용되는 광산 연쇄와 유사한 종류의 사례를 보여줍니다. 어쩌면 나의 질문은 "레일스에 올바른 방법이 있습니까?" 'sum'과 같은 집계가있는 범위를 사용 하시겠습니까? –

+0

스코프에서 계산을 실행하는 예제가 있지만 계산 범위를 정의하지는 않습니다. –

+0

그래, 분명히 일반 스코프와 조금 다릅니다. 어쨌든 솔루션은 범위와 거의 동일하게 작동합니다. –

관련 문제