rails按自定义方法排序集合

时间:2016-02-28 11:20:56

标签: ruby ruby-on-rails-4

我有一个方法,它获取项目的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)

感谢

1 个答案:

答案 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')