【发布时间】:2014-12-15 22:33:56
【问题描述】:
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"])
提前感谢您的任何回答。
【问题讨论】:
-
使用
find_by_sql()可能是将多个计数合并到单个查询中的唯一方法。我不认为 Rails 提供了更多。 -
我能想到的唯一另一件事是创建一个视图,但这仅适用于查询的子集。例如 count() & average()。
-
您的
select('count(...) as col1, ...')方法发生了什么? -
@mu,Activerecord 似乎无法识别聚合并返回关系而不是单个结果。它也不会为别名列名分配方法,因此无法使用关系。
a=@sample.select(["case when role_composer then true end as iscomposer","case when role_teacher then true end as isteacher" ])a.iscomposerNoMethodError: undefined methodiscomposer' for #<:activerecord_relation:0x000000045e82e8>` 表达式周围的括号没有帮助 -
对评论的格式表示歉意。 Markdown 并没有像我想象的那样奏效。
标签: ruby-on-rails postgresql rails-activerecord