轨排序收集通过自定义的方法
问题描述:
我有这需要项目的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)
感谢
答
我将定义喜欢的方法按照模型:
# 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)只能用于确认的付款,但没有帮助 –
您应该阅读一本关于Rails的好书!你肯定错过了'has_many'的观点,'@ collect'通常永远不会是'nil'等。 – idmean
我有模型,项目has_many支付和支付属于项目,但是当我试图选择什么时候没有所有项目付款返回无 或我错过了什么? –
正确的,现在我测试它,它的工作..谢谢,我第一次做错了 –