問題は、なぜ「ネストされたクエリ」が必要なのかということです。「ネストされたクエリ」を使用する必要はありません。これは、リレーショナル代数ではなく SQL の考え方で考えています。関係代数では、関係を導出し、ある関係の出力を別の関係への入力として使用するため、次のことが当てはまります。
points = Table(:points, {:as => 'sorted'}) # rename in the options hash
final_points = points.order('timestamp DESC').group(:client_id, :timestamp).project(:client_id, :timestamp)
絶対に必要でない限り、名前の変更は arel に任せるのが最善です。
ここで、client_id とタイムスタンプの射影は非常に重要です。関係からすべてのドメインを射影することはできないからです (つまり、sorted.*)。リレーションのグループ化操作で使用されるすべてのドメインを具体的に射影する必要があります。その理由は、グループ化された client_id を明確に表す * の値がないためです。たとえば、次のテーブルがあるとします
client_id | score
----------------------
4 | 27
3 | 35
2 | 22
4 | 69
ここでグループ化すると、値が 27 または 69 になる可能性があるため、スコア ドメインで射影を実行できませんでしたが、合計 (スコア) を射影できます。
一意の値を持つドメイン属性のみをグループに射影できます (通常、合計、最大、最小などの集計関数です)。クエリでは、ポイントがタイムスタンプでソートされていても問題ありません。最終的には client_id でグループ化されるためです。グループ化を表すことができる単一のタイムスタンプがないため、タイムスタンプの順序は無関係です。
Arel についてどのようにお手伝いできるか教えてください。また、私は、人々が Arel を中心に使用するための学習シリーズに取り組んでいます。シリーズの第 1 弾はhttp://Innovative-Studios.com/#pilot
にあります。ActiveRecord モデルの Point ではなく Table(:points) を使用したため、方法を理解し始めていることがわかります。