使用 Rails 4 Activerecord 将多个列计数合并到单个查询中

2024-01-07

Rails 4.1、Postgres 9.3,部署到 Heroku

我正在尝试减少对数据库的调用次数。

我有一个大表,调查,有多个布尔列,例如role_composer, role_performer,等等。

控制器有多个查询,例如

@sample = Survey.where(...whatever...)
@Composers = @sample.count("case when role_composer then true end")
...
@Performers = @sample.count("case when role_performer then true end")

这工作正常,但会导致对数据库的许多单独查询,这些查询仅因选择中的表达式而有所不同。有没有一种方法可以将其构造为具有多个聚合/计算列的一个查询?我还使用average() 和表达式进行查询,但最常见的是count()。

在 postgres 中,这是有效的:

SELECT count(case when role_composer then true end) as "COMPOSERS", count(case when role_performer then true end) as "PERFORMERS" from surveys;

有什么方法可以使用 @sample 上的 Activerecord 方法而不是诉诸 find_by_sql() 来做到这一点?

我尝试了多种方法均未成功:.count().count(), .count([array]), .select("count(...) as col1, count(...) as col2"), .select(["count(...) as col1", "count(...) as col2"])

预先感谢您的任何答复。


Your .select("count(...) as col1, count(...) as col2")如果您记住两件事,版本应该可以正常工作:

  1. M.where(...).select(...)即使查询只返回一行,也会返回多个内容。
  2. 只是因为有些东西没有出现在inspect输出并不意味着它不存在。

您在没有 GROUP BY 的情况下进行聚合,因此您只能返回一行。要展开该行,您可以说first:

counts = Survey.where(...)
               .select('count(case when role_composer then true end) as composers,  count(case when role_performer then true end) as performers')
               .first

这会给你一个Survey实例在counts。如果你看那个counts在控制台中,你会看到类似这样的内容:

#<Survey > 

The inspect输出仅包括列中的值(即Survey类知道)但是composers and performers将在那里。但是,由于 ActiveRecord 不知道它们应该是什么类型,因此它们将作为字符串输出:

composers  = counts.composers.to_i
performers = counts.performers.to_i

一切都在你的select如果去寻找它就会在那里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Rails 4 Activerecord 将多个列计数合并到单个查询中 的相关文章

  • 无法恢复 pg_dump 备份

    我正在尝试从 Postgres 9 1 1 恢复备份 该备份的创建者是 pg dump mydb gt backup sql 在 Postgres 9 1 9 上恢复 psql d mydb f backup sql 我收到此错误 psql
  • 未定义的方法“stringify_keys!”轨道上的红宝石

    我有这个代码 def addcar car Car new params car render action gt list end p p 它给了我这个错误 未定义的方法 stringify keys 对于 本田 字符串 我不明白出了什么
  • 从另一个控制器创建 ActiveRecord 对象 - 我做得正确吗?

    我正在建立一个培训网站 其中有两个模型 User and Course 与第三个模型相关 CourseCompletions 第三个模型用于跟踪哪个用户完成了哪些课程 反之亦然 前两种型号有控制器 而第三种则没有 我实现了完成课程的功能并且
  • 从 Rails 获取所有模型的列表[重复]

    这个问题在这里已经有答案了 我需要一个包含所有模型 类名 的列表 这些模型末尾有模式 Cube 例子 我所有的模型 ModelFoo ModelBar ModelBarCube Mode2BarCube 我需要的 ModelBarCube
  • RubyMine 无法识别 Rails 应用程序

    我有一个关于使用从目录打开方法将 Rails 应用程序导入 RubyMine 的问题 我的计算机上有两个不同的 Rails 应用程序 但 RubyMine 只将其中一个识别为 Rails 应用程序 而将另一个识别为普通目录 这是一个问题 因
  • 让 Rails 测试了解 Rails 内部链之外的 Rack 中间件

    Context 应用程序使用一个 Rack 中间件must在 config ru 中设置 而不是在 Rails 的内部中间件链中设置 这是出于与该问题无关的原因 Question 如何让我的测试 功能和集成 意识到这个中间件 我将用一个例子
  • COPY 是如何工作的以及为什么它比 INSERT 快得多?

    今天 我花了一天的时间来提高 Python 脚本的性能 该脚本将数据推送到我的 Postgres 数据库中 我之前是这样插入记录的 query INSERT INTO my table a b c VALUES s s s for d in
  • 设计 /users/sign_in 重定向到错误的控制器

    Vitals ruby 1 9 3p194 2012 04 20 修订版 35410 i686 linux Rails 3 2 7 设计2 1 2 GET users sign in 正在尝试重定向到错误的控制器 它已停止重定向到 weco
  • TikTok Oauth - 参数错误(登录套件)

    我正在尝试使用 tiktok 登录工具包 登录我的应用程序 我在 Tiktok 中创建了一个基于网络的应用程序 提供了正确的重定向域 应用程序正在 生产中 我能够重定向到titok com但是当我单击授权选项时 出现以下错误 data de
  • Rails 3 在迁移问题中添加外键

    有谁知道使用迁移在 Rails 3 中创建外键的方法吗 the 外国人宝石 https github com matthuhiggins foreigner对我来说效果很好 它向 Rails 迁移添加了一些方法 可以轻松创建和删除外键 ex
  • 如何在 PostgreSQL 函数中声明行类型数组?

    我正在尝试创建一个 PostgreSQL 函数 在用它做更多事情之前 我将循环查询的行并将其中一些存储在数组中 如何创建行类型数组 CREATE OR REPLACE FUNCTION forExample RETURNS integer
  • 数组 (UUID[ ]) 会破坏 1NF 吗?

    我的问题是包含 UUID 数组的字段是否会破坏范式 http en wikipedia org wiki Database normalization 在包含数组之前位于 NF 中的表中 原表 CREATE TABLE Floor Floo
  • Postgres 服务器性能在达到一定数量的记录后急剧下降

    我正在使用游标从大型 postgres 表中检索记录 4亿条记录 使用子表对数据进行分区 我的游标定义为 select from parent table order by indexed column 同时使用 JDBC 和 psql 前
  • 设计在 XHR 上抛出 HTTP 身份验证并注销

    我在使用 Devise 使用 OmniAuth 来验证我的 Rails 应用程序时遇到很多问题 我重新启动我的服务器并在隐身模式下打开一个新选项卡 以便清除 cookie 并加载我的应用程序 我登录 然后进入该应用程序 当我到达通过 AJA
  • Rails 中的时间字段返回空白

    我有一个在 Sqlite3 上运行的简单 Rails 3 b1 Ruby 1 9 1 应用程序 我有这张表 create table time tests do t t time time end 我看到这种行为 irb main 001
  • Flask-SQLAlchemy 多态关联

    我有两个主表role and users 以及关于users我让 3 个关联到表operator teacher and student 到目前为止 我是这样做的 class Role db Model tablename roles id
  • 在官方 Postgres docker 镜像中记录所有查询

    我有一个基于 Postgres 官方 docker 镜像的 docker 容器 当我使用查看 docker 容器的日志时 我想看到传入的查询docker logs f 这是我的 Dockerfile FROM postgres 11 1 a
  • psql:致命:角色“vagrant”不存在[重复]

    这个问题在这里已经有答案了 我创建了一个流浪实例 每次尝试时都会收到此错误psql在终端如何修复它 错误如下 psql 致命 角色 vagrant 不存在 我以为流浪汉会照顾这个 这是我的流浪文件 Vagrant require plugi
  • 如何在 rake 任务中强制使用 RAILS_ENV?

    我有这个小耙子任务 namespace db do namespace test do task reset do ENV RAILS ENV test Rake Task db drop invoke Rake Task db creat
  • Rails 3:如何获取特定时区今天的日期?

    为了获得今天的日期 我这样做 Date today gt Fri 20 May 2011 我想获取特定时区的今天日期 例如 Melbourne 我的设置中有以下设置application rb config time zone Melbou

随机推荐