特定のフィールドで一意のすべてのレコードを find() するにはどうすればよいですか?
-
19-08-2019 - |
質問
「リクエスト」オブジェクトのリストがあり、それぞれがかなり通常のアクティブレコードの品質を持っています。リクエスト テーブルは結合テーブル「games_requests」を使用してゲーム テーブルに関連付けられているため、リクエストには request.games 配列が含まれます。
問題は、最後の n 個の一意のリクエストを検索する方法はあるのかということです。一意性はゲーム列とその他のいくつかの列によって定義されますが、特に他の列 (リクエストしているユーザーの名前など) は無視されます。
「find (:all, :limit=>5, :include=>[:games,:stage])」のような構文を見たことがありますが、それは重複を返していました。
ありがとう...
編集:素晴らしい反応をくださったカオスに感謝します。かなり近づいてきましたが、戻り値が有効なリクエスト オブジェクトである必要があります。要求された行内で異なる最初の 5 つのレコード。構築したとおりに検索を使用し、最初の検索で返された各セットに一致するテーブルの最初の行に対して 2 回目の検索を実行することもできます。
編集:
Games.find(
:all, :limit => 5,
:include => [:games, :requests],
:group => 'games, whatever, whatever_else'
)
...SQL エラーが発生します:
Mysql::Error: Unknown column 'games' in 'group statement': SELECT * FROM `games` GROUP BY games
自分のプロジェクトにとって正しいと思われる内容にいくつかの変更を加えました。ゲームの代わりにリクエストのリストを取得するなど:
Request.find(
:all, :order=>"id DESC", :limit=>5,
:include=>[:games], #including requests here generates an sql error
:group=>'games, etc' #mysql error: games isn't an attribute of requests
:conditions=>'etc'
)
ここでは :join=> オプションを使用する必要があると考えています。
解決
Games.find(
:all, :limit => 5,
:include => [:games, :requests],
:group => 'games, whatever, whatever_else'
)
他のヒント
find_by_sqlとGROUP BYを使用してこれを行うことができると思います:
Games.find_by_sql("SELECT * FROM games GROUP BY user_id")
所属していません StackOverflow