0

所以我已经想出了如何在裸 SQL 中查询我想要的内容,但是 ActiveRecord 并没有真正的方法来传递裸 SQL。我真的很纠结如何把它变成 AR 友好的方法/范围。任何帮助表示赞赏。

SELECT foo.status, count(*)
    FROM (
        SELECT t1.*
        FROM checkins t1
        WHERE t1.time = (SELECT MAX(t2.time)
                 FROM checkins t2
                 WHERE t2.host_id = t1.host_id
                 AND time <= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 MINUTE
                 )
    )

) as foo
GROUP BY foo.status

编辑:我想澄清数据的样子。它是主机签到列表,以提供其可用性。所以该表有 3 列:host_id、时间、状态。状态是“可用”或“不可用”。我正在尝试做的是花费任意时间并在此之前找到最近的签入并总结两种状态类型(即有多少计算机可用以及有多少正在使用)。

我不反对以“正确”的 AR 方式来做这件事,但我会随着时间的推移绘制计算机使用情况图表,所以我不希望它变成 40 个查询来获取所有信息。

此外,在理想的世界中,这将是一个范围(或类似的),以便我可以将它与其他约束链接起来。Host.where(...).available_count 之类的东西。

4

1 回答 1

0

如果原始 SQL 对您来说是一个有效的解决方案,您可以尝试:

rows = ActiveRecord::Base.connection.select_all(query)

然后

rows.each do |row|
  value = row["status"]
  count = row["count"]
end
于 2013-06-28T21:46:37.127 回答