【问题标题】:Rails SQL select, doesn't seem to work as expected with the CASE statementRails SQL select,CASE 语句似乎无法正常工作
【发布时间】:2020-03-03 15:43:28
【问题描述】:

我正在尝试了解如何在查询中使用 select 方法来返回自定义列。

我正在运行 Rails 5.2,数据库是 postgresql。

m = Message.all.select("messages.*, CASE WHEN id > 30 THEN TRUE ELSE FALSE END AS above_30")

仅返回包含所有列的消息表。我如何获得above_30 列,最好预先加载?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

    above_30 在那里,但 Rails 不会为其定义访问权限,因为您的架构中没有该名称的列。

    您可以自己定义一个,或使用m[:above_30] 访问从查询返回的对象的“原始”属性。

    【讨论】:

    • 是的,这行得通。谢谢。我还有一个问题,希望你能回答。我尝试使用包含来急切加载所有关联的上述语句,如下所示:m= Message.all.select("messages.*, CASE WHEN id > 30 THEN TRUE ELSE FALSE END AS above_30").includes(:user) 这导致了 2 个 SQL 语句。第一个是预期的,消息加载获取所有消息类型对象。但是第二个是用户负载,就像SELECT "users".* FROM "users" WHERE "users"."id" IN ($1, $2, $3, $4, $5, $6)你能解释一下这里发生了什么吗?
    • @kchak 这就是急切加载的作用。两个查询而不是 N+1,其中 N 是关联记录的数量。它通过在返回的消息中获取不同的用户 ID 集并查询这些用户,在单个查询中加载所有 users
    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2019-05-16
    • 2015-02-06
    • 2011-05-05
    • 1970-01-01
    • 2017-09-04
    • 2012-05-06
    相关资源
    最近更新 更多