【发布时间】:2017-05-02 01:37:40
【问题描述】:
我已经为此研究了一段时间......我找不到一个优雅的解决方案。我有loans 和loans has_many :decisions。 decisions 有一个我关心的属性,叫做risk_rating。
我想根据最近的决定(通常基于 created_at)对loans 进行排序,但按risk_rating 排序。
Loan.includes(:decisions).references(:decisions).order('decisions.risk_rating DESC') 不起作用...
我想要贷款...按他们最近决定的 risk_rating 排序。这似乎应该比现在更容易。
我目前正在像这样在数据库之外执行此操作,但它会占用时间和内存:
Loan.all.sort do |x,y|
x.decisions.last.try(:risk_rating).to_f <=> y.decisions.last.try(:risk_rating).to_f
end
我想展示我提出的答案的表现,以及不准确之处...
Benchmark.bm do |x|
x.report{ Loan.joins('LEFT JOIN decisions ON decisions.loan_id = loans.id').group('loans.id').order('MAX(decisions.risk_rating) DESC').limit(10).map{|l| l.decisions.last.try(:risk_rating)} }
end
user system total real
0.020000 0.000000 0.020000 ( 20.573096)
=> [0.936775, 0.934465, 0.932088, 0.922352, 0.921882, 0.794724, 0.919432, 0.918385, 0.916952, 0.914938]
顺序不对。 0.794724 不合适。
在那个程度上......我只在建议的答案中看到一个属性。我没有看到连接 =/
【问题讨论】:
-
你用的是什么数据库?
-
我们正在使用 MySQL
-
@IlyaLavrov 如果你用 Arel 适当地抽象也没关系。 ;)
-
@brendandeere 你能具体描述一下它与我的问题有什么关系吗?我似乎无法获得与我正在寻找的结果集相匹配的结果。
标签: ruby-on-rails ruby activerecord