【问题标题】:how to translate this PostgreSQL query into activerecord如何将此 PostgreSQL 查询转换为 activerecord
【发布时间】: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


    【解决方案1】:

    您可以将原始 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 将无法执行其所有的输入清理魔法。

    【讨论】:

    • 谢谢,但 NULLS LAST 似乎不是默认值。 12.2版
    • 哦,我猜 NULLS LAST 默认值已经改变了,我的错。至于添加.where:这很奇怪,它破坏了一些东西,我不确定到底发生了什么。为了帮助调试,在查询末尾添加.to_sql 并打印出来的输出是什么?
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多