1

私のアプリケーションでは、ユーザーにハイライトがあります。

各 Highlight には HighlightType があります。したがって、実行するuser.highlightsと、次のような出力が表示される場合があります。

user.highlights の例

type_id 47 の多くのハイライトがあることに注意してください。これは、ユーザーが実行した回数のマイルストーンをマークします。

私がやりたいのは、このレコードの完全なリストを返すことですが、各 highlight_type に対して 1 つのハイライトのみを含め、その 1 つのレコードを最新のレコード (この場合は「50 回目の実行」ハイライト) にすることです。したがって、上記の例では、同じ結果が得られますが、ID 195-199 が削除されます。

これを達成する効率的な方法はありますか?

4

1 に答える 1

1

それを達成するための簡単でクリーンな方法や「Railsの方法」はないと思います。たとえば、このリンクを見てください

そのリンクの 1 つの提案によると、次のSQL 要求を実行します。

SELECT h1.*
FROM highlights h1
LEFT JOIN highlights h2
 ON (h1.user_id = h2.user_id 
     AND h1.highlight_type_id = h2.highlight_type_id
     AND h1.created_at < h2.created_at)
WHERE h2.id IS NULL AND h1.user_id = <the user id you are interested in>
group by h1.highlight_type_id

おそらく大きなテーブルがあると、パフォーマンスの問題が発生すると思いますが、それほどきれいではないと思います。

それ以外の場合、ユーザーのハイライトがあまりない場合は、次のようにします。

rows = {}
user.highlights.order('highlight_type_id, created_at DESC').each do |hi|
  rows[hi.highlight_type_id] ||= hi
end
# then use rows which will have one object for each highlight_type_id

on created_atDESCは重要です

編集: これに基づいていくつかの提案も見ました 。user.highlights.group('highlight_type_id').order('created_at DESC') それが最初に解決すべきだと思った方法でもありましたが、テストしたところ、少なくとも私のテストデータでは正しい結果が得られないようです。

于 2012-11-27T00:37:54.420 に答える