gpt4 book ai didi

ruby-on-rails - ActiveRecord 排序模型基于最后一个 has_many 关系的属性

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:42 25 4
gpt4 key购买 nike

我已经为此研究了一段时间...我找不到合适的解决方案。我有 loansloans has_many :decisionsdecisions 有一个我关心的属性,称为 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 不合适。

就此而言...我在建议的答案中只看到一个属性。我没有看到连接 =/

最佳答案

好吧,看来我今晚工作到很晚,因为我忍不住插了进来:

class Loan < ApplicationRecord
has_many :decisions
has_one :latest_decision, -> { merge(Decision.latest) }, class_name: 'Decision'
end

class Decision < ApplicationRecord
belongs_to :loan

def latest
t1 = arel_table
t2 = arel_table.alias('t2')

# Self join based on `loan_id` prefer latest `created_at`
join_on = t1[:loan_id].eq(t2[:loan_id]).and(
t1[:created_at].lt(t2[:created_at]))

where(t2[:loan_id].eq(nil)).joins(
t1.create_join(t2, t1.create_on(join_condition), Arel::Nodes::OuterJoin)
)
end
end

Loan.includes(:latest_decision)

这不排序,只提供每笔贷款的最新决定。由于表别名,抛出一个引用 access_codesorder 会把事情搞砸。我现在没有时间解决这个问题,但我敢打赌,如果您查看 Arel 上的一些重要资源以及如何将它与 ActiveRecord 一起使用,您一定会弄明白的。我真的很喜欢this one .

关于ruby-on-rails - ActiveRecord 排序模型基于最后一个 has_many 关系的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43728803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com