【发布时间】:2020-02-29 15:44:23
【问题描述】:
SELECT id, (SELECT SUM(s) FROM UNNEST(invested) s) as temp from times ORDER BY temp DESC NULLS LAST;
【问题讨论】:
标签: ruby-on-rails postgresql activerecord
SELECT id, (SELECT SUM(s) FROM UNNEST(invested) s) as temp from times ORDER BY temp DESC NULLS LAST;
【问题讨论】:
标签: ruby-on-rails postgresql activerecord
您可以将原始 SQL 传递给 #select 以选择动态/计算值。未经测试,但看看这样的东西是否有效:
tasks = Task
.select('id, (SELECT SUM(s) FROM UNNEST(priorities) s) AS temp_sum')
.order(temp_sum: :desc)
# tasks.first.id => the Task ID
# tasks.first.temp_sum => the SQL-calculated value
默认情况下,Postgres 将空值排在最后,因此 NULLS LAST 并不是绝对必要的。当然,如果您想完全明确,您可以保留它:.order('temp_sum DESC NULLS LAST')。
对于这个确切的用例来说这不是问题,因为您没有传递任何用户输入的值,而只是作为一般警告:在传递原始 SQL 时,请务必小心 SQL 注入漏洞!因为当你只传入原始字符串时,Rails 将无法执行其所有的输入清理魔法。
【讨论】:
.where:这很奇怪,它破坏了一些东西,我不确定到底发生了什么。为了帮助调试,在查询末尾添加.to_sql 并打印出来的输出是什么?