通常の ActiveRecord インターフェイスでは確実にこれを行うことはできませんが、ウィンドウ関数を使用して SQL を通じて行うことができます。次のような SQL が必要です。
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
そしてそれをラップしfind_by_sqlます:
pulses = UserPulses.find_by_sql([%q{
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
}, :user_id => user.id])
ウィンドウ関数部分は基本的に、各 でローカルの GROUP BY を実行しgroup_id、それらを並べ替え ( id desc「念のため」のタイ ブレーカーとして 2 番目の並べ替えキーとして)、グループごとの行番号を に追加しrます。次に、外側のクエリは、各グループ ( where r = 1) and peels off the originaluser_pulses` 列の最初の列を除外します。