2012-04-20 10 views
0

私はここで多くを検索しましたが、似たようなトピックは見つかりませんでした。私はwill_paginateを使用して結果をブラウズするため、Arelのクエリを書く必要があります。ここでArelでグループ化されたサブクエリに参加しますか?

iはARELで綴るために必要なものです:

SELECT m.* 
FROM messages m 
JOIN (SELECT tmp.original_id as original_id, 
       max(tmp.id) as id 
     FROM messages tmp 
     WHERE tmp.recipient_id = ? 
     GROUP BY tmp.original_id) g ON (m.id = g.id) 
ORDER BY m.updated_at DESC; 

は、短い言葉で説明:副問合せは、ユーザーのすべてのメッセージを取得します。メッセージに新しい返信がある場合(返信では元のidという参照メッセージIDを保存します)、古いメッセージは無視されます。これらすべてのメッセージの結果として、私はRailsが私に対応するオブジェクトを提供してほしい。

私はSQLには熟練していますが、残念ながらArelではありません。どんな助けも親切に評価されるでしょう。

答えて

0

どうやってこのようなことができますか?

class Message < ActiveRecord::Base 
    scope :newer_messages lambda { |num_days=10| where("updated_at > #{Time.now} - #{num_days}.days") } 
end 

あなたは、このような特定のユーザーのために、新しいメッセージを見つけることができます:

Message.find_by_user_id(user_id).newer_messages 
+0

面白いアイデアを。これはうまくいくかもしれませんが、私はパフォーマンス上の理由から別のオプションを選択し、データベースに最新の応答をトリガ関数で事前に計算させます。お疲れ様でした。 –

+0

このようなチェーンを連鎖させると、データベースに発行される選択クエリは1つだけです。 (これらは1つのスコープで実行されるため)。これをサーバーログから見ることができます。私はあなたが複数の選択クエリを発行していると思っている場合に備えて、これについて言及しています。 – Salil

関連する問題