(Ruby 1.9.3-p429; Rails 3.0.6) テストをキューに入れる方法に対する最近の変更により、last_ids スコープがレンダリングされました。
last_ids = tests.where('end_time != 0').
group(:condition1, :condition2, :condition3, :condition4).
select('max(id) as id')
論理的に時代遅れ。以前は、テストはキューに入れられ、テスト レコードが作成されたのと同じ順序で完了していたため、各グループの最大 ID も最新のテスト レコードでした。現在、効率のために、テストの順序を保証しないキューイング アルゴリズムがあります。テスト テーブルに「end_time」列を追加しました。私の解決策は、これまでのところ遅すぎて使用できません:
max_end_times = tests.where('end_time != 0').
group(:condition1, :condition2, :condition3, :condition4).
.maximum(:end_time)
これはハッシュを生成します: {[:condition0, :condition1, :condition2, :condition3]=>:endtime}. それから私は次のようにします:
hash.each_pair do |key, value|
last_ids << tests.select(:id).
where(condition0: [key[0]]).
where(condition1: [key[1]]).
where(condition2: [key[2]]).
where(condition3: [key[3]]).
where(end_time: [value]).
map(&:id)[0]
end
これは機能しますが、完全に遅すぎます。
それで...特定のグループ化の最大値(:end_time)を一致させる方法を知っている人はいますが、:idのみを返しますか?(データベースから取得する必要があるのは、各グループの最新のテストの :id だけです)。
編集:明確化。