这个复杂的SQL语句可以转换为单个AR语句吗?

时间:2013-06-28 21:35:10

标签: sql ruby-on-rails ruby activerecord

所以我已经研究了如何在裸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,time,status。状态为“可用”或“不可用”。我正在尝试做的是花费任意时间并找到最新的签到并总结两种状态类型(即有多少台计算机可用以及有多少台计算机正在使用中)。

我并不反对以“正确的”AR方式执行此操作,但我正在绘制计算机使用情况,因此我不希望将其变为40个查询以获取所有信息。

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

1 个答案:

答案 0 :(得分:0)

如果原始SQL是适合您的有效解决方案,您可以尝试:

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

然后

rows.each do |row|
  value = row["status"]
  count = row["count"]
end