2016-09-25 13 views
0

나는 전에 이것을 보지 못했습니다. 나는 whos 값이 문자열이고 float/int가 아닌 테이블 속성으로 작업하고 있습니다.값이 문자열 인 경우 테이블 합계의 합계

Model.first.amount => "58.00" 

모든 금액을 합산해야합니다. 내가이 amount이 부동 인 상태, 사용 해요, 다음과 같습니다

Model.all.sum(&:amount) => # total value 

가와 추측에 나섭니다 :

Model.all.sum(&:amount.to_i) # undefined method `to_i' for :amount:Symbol 

양을 요약하는 깨끗한 방법이 있나요? 또는 데이터베이스를 float으로 변환 하시겠습니까?

+0

캐스팅을 SELECT CAST ('1234'AS FLOAT)로 수행해야합니다. –

+0

화폐 금액에는 수레를 사용하지 않아야합니다. – Stefan

+0

알아. 나는 다른 사람과 일하고있어. 그들은 그것을 바꾸는 것을 듣지 않을 것입니다. – Sylar

답변

3

루비와 처리 데이터베이스가 슈퍼 메모리 효과가!

첫 이미지 촬영 :

Model.sum("CAST(COALESCE(amount, '0') AS DECIMAL)") 
  1. coalesce'0'
  2. sum 모든 값에 null 값을 대체합니다 :

    Model 
        .pluck(:amount) # will fire sql 
        .sum(&:to_f) # convert to float, operating on resulting Array, not AR and sum 
    

    그러나 데이터베이스의 데이터를 처리 할 수있는 가장 효과적인 방법은 물론 SQL입니다 casted to DECIMAL.

+0

IIRC, 정밀도를 지정해야합니다. 'DECIMAL (10,2)' – Stefan

+0

정확도를 지정하는 @Stefan AFAIR은 선택 사항입니다. –

2

순수 루비에서는 inject 메서드를 사용할 수 있습니다.

Model.all.inject(0) { |sum, object| sum += object.amount.to_i } 
+2

나쁜 생각, 많은 경우이 접근 방식은 메모리 과부하로 이어질 것입니다. –

0

내가 코멘트 권한이 해달라고하지만,이 루비를 위해 작동합니다 :

Model.all.map(&:to_f).reduce(&:+) 
+0

개체 자체가 아닌 금액 속성의 값을 합산해야하므로이 방법은 작동하지 않습니다. 'Model.all.map (& : amount) .map (& : to_f) .reduce (& : +)' –

관련 문제