0

(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 だけです)。

編集:明確化。

4

1 に答える 1

0

ActiveRecord::Calculations#pluck

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

編集:持っていない場合#pluckでも、おそらく1つのクエリでこれを行うことができます#map

tests.where('end_time != 0').
             group(:condition1, :condition2, :condition3, :condition4).
             select('id, max(created_at)').map(&:id)
于 2013-08-09T18:42:47.690 に答える