我有一个方法,它获取项目的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 :(得分: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
然后你可以使用这样的方法:
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')