2014-10-13 2 views
0

간단한 인보이스 앱을 만들고 있습니다. 나는 has_many : items 및 : items belongs_to : invoice라는 송장 모델을 가지고있다.반복하여 합계를 얻으십시오.

모델 스키마가 진행되는 한 : : 송장에는 제목을 저장하기위한 열과 항목이 모든 (가격 책정) 금액과 수량 세부 정보를 처리합니다.

인보이스 목록이있는 "인보이스"색인이 있으며 "총 금액"과 함께 표시됩니다. 각 송장의 총 금액은 송장의 모든 항목을 소요 금액으로 곱하여 송장의 모든 항목의 합계를 결정하는 항목 모델에서 설정 한 "quantity_amount_sum"방법을 통해 결정됩니다.

모델 : item.rb

def quantity_amount_sum 
    return self.quantity * self.amount 
end 

index.html.erb

<% @invoices.each do |invoice| %> 
$<%= invoice.item_amount.sum.floor %> 
<% end %> 

모델

def item_amount 
    @@item_amount = self.items.map(&:quantity_amount_sum) 
    end 

invoice.rb 문제는 그 다음 "는 정리해 노력에 총액 "(예 : 두 개의 인보이스, 항목의 합계가 각각 인보이스 # 1, 인보이스 # 2, 인보이스 # 2, 총액 $ 200) 총 송장 수는 300 달러). 나는 "each do"를 총계로 사용하여 각 인보이스를 반복 해 보았습니다 만, 마지막 인보이스의 합계 만 검색 할 수 있었지만 둘을 합친 적이 없었습니다.

$<%= @invoices.total_val.each.sum %> 

합계가 $ 300이어야한다 반면이, 마지막 송장 (또는 $ (200))의 합을 생산하는 것

def self.total_val 
    @@item_amount 
    end 

모델 invoice.rb. 이것에

<% @invoices.each do |invoice| %> 
$<%= invoice.item_amount.sum.floor %> 
<% end %> 

: 당신은 당신이 줄 변경할 수 있습니다 모두 송장의 총 합을 원하는 경우에

답변

0

그러나

$<%= @invoices.map(&:item_amount).flatten.sum %> 

을, 당신이 송장의를 계산하는 항목에 접근하고 있음을 볼 수 총액. 대신 total to invoices 테이블이라는 새 열을 추가하는 것이 좋습니다. 나중에, 당신은 당신의 Invoice 모델에 콜백을 만들 수 있습니다 : 데이터가 증가하면 미래에 액세스하고 반복하기 쉬운 것입니다

before_save :update_total 

def update_total 
    self.total = self.items.map{|i| i.quantity_amount_sum }.sum 
end 

합니다. 또한 항목이 편집중인 경우 Invoice의 총계를 업데이트하는 Item 클래스에 다른 콜백이 있는지 확인하십시오.

그런 다음보기로 변경할 수 있습니다 또한

$<%= @invoices.map(&:total).sum %> 

, 여기 return를 작성할 필요가 없습니다 :

def quantity_amount_sum 
    self.quantity * self.amount 
end 

루비는 기본적으로 마지막 표현을 반환합니다.

관련 문제