【发布时间】:2021-01-15 11:50:17
【问题描述】:
我有以下返回预期结果的数据和 SQL 查询。我现在正尝试使用 Groupdate(和 ActiveMedian)在 Rails 中实现相同的目标。
| user_id | points | created_at |
|---|---|---|
| 1 | 5 | 2020-10-01 |
| 1 | 15 | 2020-11-01 |
| 1 | 20 | 2020-11-02 |
| 2 | 33 | 2020-11-01 |
SELECT
AVG(points) AS points,
DATE_TRUNC('MONTH', created_at) AS period
FROM
(
SELECT
SUM(points) AS points,
DATE_TRUNC('MONTH', created_at) AS created_at
FROM
user_points
WHERE
created_at IS NOT NULL
GROUP BY
user_id,
DATE_TRUNC('MONTH', created_at)
) points_per_user_per_period
GROUP BY
DATE_TRUNC('MONTH', created_at)
我期待
| points | period |
|---|---|
| 5 | 2020-10-01 |
| 34 | 2020-11-01 |
结果
UserPoints.from(
UserPoints.group(:user_id).group_by_month(:created_at).sum(:points)
).group_by_month(:created_at).average(:points)
但由于.sum(:points) 立即执行,它不起作用。我可以用另一种方式制定查询或使sum 不立即执行吗?还有其他想法吗?
总结结果应该是什么;用户在一段时间内获得的平均积分数。
【问题讨论】:
-
如果 SQL 查询正常,您可以使用
ActiveRecord::Base.connection.execute(sql_string)执行查询。它作为一个元组返回,所以如果你在返回时调用values,你会得到结果 -
这就是我目前正在做的事情,但我想让它更通用,更像 Rails :)
-
有时这就是 Rails 的方式。您可能已经在这个用例中发现了 AR 的局限性。我以前必须使用这样的原始 SQL 以确保尽可能优化,然后在结果上使用 rails/ruby,但尽可能多地在数据库上做繁重的工作。
标签: ruby-on-rails postgresql activerecord