特定のフィールドで一意のすべてのレコードを find() するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/651181

質問

「リクエスト」オブジェクトのリストがあり、それぞれがかなり通常のアクティブレコードの品質を持っています。リクエスト テーブルは結合テーブル「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'
)

他のヒント

Rails uniq_by を試してみてください。関連付けも機能し、配列を返します。

@document = Model.uniq_by(&:field)

もっと 詳細

find_by_sqlとGROUP BYを使用してこれを行うことができると思います:

Games.find_by_sql("SELECT * FROM games GROUP BY user_id")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top