2016-02-28 32 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)只能用于确认的付款,但没有帮助 –