【问题标题】:Can this complex SQL statement be converted to a single AR statement?这条复杂的 SQL 语句可以转换为单个 AR 语句吗?
【发布时间】:2013-06-28 21:35:09
【问题描述】:

所以我已经弄清楚了如何在裸 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 之类的东西。

【问题讨论】:

  • 你的模型在这里是什么样子的?是否有任何关联,或者只是一个模型?
  • 要与 ActiveRecord 一起工作,您需要找到一种编写非嵌套查询的方法。
  • 我有一个主机模型,它有_many checkins。签到属于主机。我也有组有_许多主机和主机属于_一个组
  • 要明确 checkins 表是各种主机的状态更改列表。它们具有 Time、Host_ID 和 Status 条目。这两种状态是“可用”和“不可用”。该表在一个巨大的列表中包含所有主机的条目。我想要做的是及时获取一个部分,并在该时间之前找到每个主机的最新条目并计算“可用”和“不可用”

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

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

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

然后

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

【讨论】:

  • 在一个完美的世界里,我可以把它变成一个范围,这样我就可以把其他东西链接到它上面。例如,如果我将主机分组,则可以执行 .hosts.checkins.available_at(
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多