2014-02-21 42 views
1

我做了一個應用程序使用貨幣插件來表示錢,它介紹了3個域的類,MoneyCurrencyExchangeRate最好的方法來幫助貨幣插件的性能做計算時

這裏的Money域類:

https://github.com/ricardojmendez/grails-currencies/blob/master/src/groovy/cr/co/arquetipos/currencies/Money.groovy

只是爲了更容易解釋的緣故,讓剛剛說我有2類:SalesOrderOrderItem

SalesOrder:

class SalesOrder { 


     static hasMany = [orderItems:OrderItem] 

     List<OrderItem> orderItems 
     String customer 
     def getTotal(){ 
      Money total = Money.getInstance("0 USD") 
      orderItems.each{ 
       total+=it.getTotal() 
      } 
      total 
     } 

} 

OrderItem的:

class OrderItem{ 



     static belongsTo = [salesOrder:SalesOrder] 
     static embedded = ['price'] 

     Money price 
     int quantity 
     String itemName 

     def getTotal(){ 
      price * quantity 
     } 

} 

的目標是獲得一個總的每個SalesOrder,因爲我不認爲我可以寫一個查詢Money計算總

(因爲exchangeRate和貨幣都包含在每個Money對象中):

我可以有一筆錢被定義爲「金額:25,貨幣:美元」,另一個「金額:500,貨幣:日元」,如果我只是查詢金額部分,結果將被關閉,因爲它不將貨幣轉換爲同一個貨幣。

,我被迫在SalesOrder貫穿每一個OrderItem循環,你可以想像表現得如此糟糕,我花了近18秒,一共拿到了30 SalesOrder秒。 (在SalesOrder的靜態映射中添加「orderItems fetch:'join'」後,我可以將其降低到9秒,但9秒仍然太多)

這個插件不是很流行,如果有人遇到類似這樣的事情,那麼如果你有處理這類問題的經驗,請幫助我。

謝謝

回答

0

爲什麼不呢?像

def total = OrderItem.withCriteria(uniqueResult:true){ 
    projections{ sum 'price.amount' } 
    eq 'salesOrder', salesOrder 
} 

事情可以做

+0

因爲貨幣/匯率是參與,不是所有的錢保存在同一貨幣的伎倆,轉換有以前不同的貨幣每款物進行。 我本來可以保存一張「25美元」和一張「5000日元」,如果您只是簡單地查詢金額,總數就會大大減少。 – 16dots

+0

好的,我明白了。我會添加一個新字段來存儲一種貨幣的價格,比如在'$'中,並通過在$'中重新計算來保存所有其他貨幣值。因此,您可以隨時獲得美元數額並將其重新計算爲目標貨幣。這並不簡單,但你幾乎沒有其他選擇 – injecteer