そこで、生の 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
編集:データがどのように見えるかを明確にしたかったのです。これは、ホストが可用性を提供するためのチェックインのリストです。したがって、テーブルには、host_id、time、status の 3 つの列があります。ステータスは、「使用可能」または「使用不可」のいずれかです。私がやろうとしているのは、任意の時間をかけて、それより前の最新のチェックインを見つけ、2 つのステータス タイプ (つまり、利用可能なコンピューターの数と使用中のコンピューターの数) を合計することです。
これを「適切な」AR の方法で行うことに反対しているわけではありませんが、時間の経過に伴うコンピューターの使用状況をグラフにしているので、すべての情報を取得するために 40 回のクエリを実行したくありません。
また、理想的な世界では、これはスコープ (または同様のもの) であるため、他の制約と連鎖させることができます。Host.where(...).available_count などのようなもの。