2014-06-05 3 views
2

를 강요 할 수 없습니다 나는 그 주어진 사용자에 대한 내 Pack 모델에 :amount 필드의 모든 레코드를 요약 할 수있는 다음과 같은 기능이 있습니다ERROR : 무기 호는 Fixnum이라는

user.rb을

def total_money_spent_cents 
    amount = self.packs.map(&:amount).sum 
    return amount 
    end 

그러나, 나는 다음과 같은 오류가 나타납니다이 기능을 사용하는 경우 :

nil can't be coerced into Fixnum 

어떤 제안?

편집 나는 여전히 내 테스트에서 Fixnum이라는에 관해서 문제가, 그리고 here 열린 또 다른 질문이 있어요.

+0

귀하의 팩 중 일부가 nil과 같아야합니다.'self.packs.map (& : amount) .select {| x | x! = nil} .sum' –

답변

8

팩 중 하나에 금액 필드가 아직 설정되지 않았으므로 nil입니다. Ruby가 타입에 추가 할 수있는 타입으로 루비가 마사지 할 수 있는지 확인하기 위해 타입 강제 변환을 시도합니다.하지만 그렇게 할 수 없으므로이 에러가 발생합니다.

하나 개의 솔루션이있다 :

def total_amount_spent_cents 
    packs.map(&:amount).compact.sum 
end 

Array#compactnil 요소를 제거한다.

증상이 수정되었을 수도 있지만 실제 문제는 아닙니다. nil이 전혀 없어야 할 수도 있습니다.이 경우 Pack 모델 (또는 유효성 검사)의 초기화를 확인하여 amount이 필수임을 확인해야합니다.

+0

nil 값을 제거하는 함수가'compact'였던 것을 기억하려고했습니다. –

+0

이것은 내가 의심 스럽지만 compact가 실제로 오류를 제거함과 동시에 올바른 계산 결과를 가져옵니다. 이상한 점은 현재 데이터베이스에 유효한 총 금액이있는 총 2 개의 Pack 항목 만 있습니다. Pack 모델은 또한 금액의 존재를 확인합니다. 해결책을 가져 주셔서 감사합니다.하지만 어디에서 무의미한 가치가 나오는지 궁금합니다. – zenben1126

+0

잠재적으로'User.build_pack'와 같은 메소드를 사용하거나'inverse_of' 관계를 설정하면 User 모델은 메모리에는 있지만 데이터베이스에는 존재하지 않고 그 ID와 연관된 팩을 인식합니다. 그런 다음 유효성이 검사되지 않은 사용자와 연결된 팩이있을 수 있으므로 0 값을 가질 수 있습니다. – amnn

0

배열과 해시에 추가 메서드를 추가했습니다. 즉, compact과 비슷하지만 모두 034가 아닌 blank?에 대해 true를 반환하는 모든 값을 제거합니다. 따라서 빈 문자열, 빈 배열, 해시 등을 제거합니다. 그것은 특히 PARAMS에 유용

class Hash  
    def compact_blank! 
    self.each{|k,v| self.delete(k) if v.blank? } 
    self 
    end 

    def compact_blank 
    self.dup.compact_blank! 
    end 
end 

class Array 
    def compact_blank! 
    self.delete_if(&:blank?) 
    end 

    def compact_blank 
    self.dup.compact_blank! 
    end 
end 

사용

["1", "abc", "", nil, []].compact_blank 
=> ["1", "abc"] 

처럼, 당신은 빈 문자열을 통해 많이 얻을 수있는 곳.