2017-08-11 19 views
1

私はRails 5とPostgreSQLを使用しています。 この質問は、以前のバージョンのRails(Rails 4、distinct、uniqなどを使用していましたが、Rails 5で減価償却されて以来私のために働いていませんでした)Rails 5 - uniq属性を持つクエリレコード

Uploadモデルがあり、uuidという属性があります。 列挙型からuniqを使用せずに別のuuidのレコードをフェッチしたいとします。ここで

は私の元のクエリです:

Upload.includes(:user, product: [:catalog]).where(file_type: "product_attachment", product_id: nil, user_id: current_user.id)) 

distinctselectを追加するとき、私はエラーが出る(と私はここに、オブジェクト全体を必要としながら、これらのメソッドは、多くの場合、モデルから一つだけattributを返すために使用されているようにそれはそう)。

これをRails 5でどのように達成するかについてのアイデアはありますか?サンプルデータと

編集:

アップロード:期待される結果のみが異なるを有する、ID 1と2とのアップロードを(含むことになるよう

id: 1 
uuid: 8e8fece82b6b1368ab6f21852c625e85718d210e 

id: 2 
uuid: 842e7650b4bba97f097d9cf57f47d8160086b7cd 

id: 3 
uuid: 8e8fece82b6b1368ab6f21852c625e85718d210e 

アップロード1及び3は、同じUUIDを有しますuuid)。

+0

テーブル内のデータと予想される結果の最小限の例を作成できますか? Upload.select( 'DISTINCT ON(uploads.uuid)、uploads。*)'のようにselectを使うか、横方向結合のようなものを使うことができます。 – max

+0

@maxちょっと具体的な例を使って編集しました –

+0

@max私はすでにあなたのクエリのような選択を試みましたが、このエラーが発生します: ActiveRecord :: StatementInvalid:PG :: SyntaxError:ERROR:または近くの構文エラー "、" LINE 1:SELECT DISTINCT ON(uploads.uuid)、アップロード。* FROM "アップロード –

答えて

0

あなたはそれがUNIQを使用せずに、あなたのすべての個別のレコードを与えgroup;を使用することができます。

それを打破するには uuidのすべての重複するグループの最小 id

Upload.includes(:user, product: [:catalog]).where(file_type: "product_attachment", product_id: nil, user_id: current_user.id)). 
     where(id: Upload.group(:uuid).select("min(id)")) 

であなたがUploadをしたいと仮定すると、

ABC.group(:uuid) 
1

、この句は、を除く210 id

where(id: Upload.group(:uuid).select("min(id)")) 
関連する問題