2016-02-28 37 views
0

我有這需要項目的ID,發現所有支付的方法,做數學和輸出是成功的比例(與收集的目標量)軌排序收集通過自定義的方法

def projectCollectedMoneyPerc(id) 
    @project= Project.find(id) 
    @collected = Payment.where('project_id = ? and confirmed = true', @project.id) 
    @col = @collected.sum(:amount) 

    @perc = ((@col.to_f/@project.amount) * 100).round(0) 
end 

現在我需要找到成功率最高的項目。我的想法是調用由sort_by這種方法,但我不知道如何把ID從收集到這種

我的收藏是簡單

@projects=Project.where('enabled = true and enddate > ?', Time.now) 

感謝

+0

您應該閱讀一本關於Rails的好書!你肯定錯過了'has_many'的觀點,'@ collect'通常永遠不會是'nil'等。 – idmean

+0

我有模型,項目has_many支付和支付屬於項目,但是當我試圖選擇什麼時候沒有所有項目付款返回無 或我錯過了什麼? –

+0

正確的,現在我測試它,它的工作..謝謝,我第一次做錯了 –

回答

1

我將定義喜歡的方法按照模型:

# in app/models/project.rb 
has_many :payments 

def collected_money_percentage 
    sum = payments.where(confirmed: true).sum(:amount) 
    (100.0 * sum/amount).round 
end 

然後你cound使用像這樣的方法:

Project.where('enabled = true and enddate > ?', Time.now) 
     .sort_by(&:collected_money_percentage) 

請注意,這首先加載所有匹配的記錄,然後在內存中計算percentage。計算數據庫中的這個值可能會更快:

Project.joins(:payments) 
    .where('enabled = true and enddate > ?', Time.now) 
    .group('projects.id') 
    .order('SUM(payments.amount)/projects.amount') 
+0

謝謝,第一個選項使用自定義函數工作正常.. 第二個選項看起來它工作正常,但訂購是錯誤的 我'我在那裏添加了條件(和payments.confirmed = true)只能用於確認的付款,但沒有幫助 –