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

編集:データがどのように見えるかを明確にしたかったのです。これは、ホストが可用性を提供するためのチェックインのリストです。したがって、テーブルには、host_id、time、status の 3 つの列があります。ステータスは、「使用可能」または「使用不可」のいずれかです。私がやろうとしているのは、任意の時間をかけて、それより前の最新のチェックインを見つけ、2 つのステータス タイプ (つまり、利用可能なコンピューターの数と使用中のコンピューターの数) を合計することです。

これを「適切な」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 に答える