前提・実現したいこと
ruby 2.6.5
Rails 6.0.4
Railsでアプリを作成しています。
リレーション先のモデルにあるカラムで並び替えをしたいのですが、order句の実行の際に、DISTICT句のSQOが発行され、それが思ったように動かず、同じIDのものをいくつも残してしまっています。
itemsの一覧画面に、そのitemに紐づくshopsの情報を羅列させたい(画像のように)のですが、SQL文がうまく生成されません。
詳細
テーブル
items
ID | name | shop_id | updated_at |
---|---|---|---|
1 | book | 1 | 2021/11/11 |
2 | pen | 2 | 2021/11/12 |
3 | notebook | 3 | 2021/11/13 |
・ | |||
・ | |||
・ |
shops
ID | name | order_number |
---|---|---|
1 | a_shop | 1 |
2 | b_shop | 2 |
3 | c_shop | 3 |
・ | ||
・ | ||
・ | ||
### コード | ||
items_controllers.rb | ||
``` | ||
def index | ||
items = Items.all | ||
items = items.eager_load(:shops) | ||
items = items.order(updated_at: 'DESC') | ||
items = items.order('shops.order_number') | ||
end | ||
``` | ||
#### 生成されたSQL | ||
ひとつめ | ||
``` | ||
SELECT DISTINCT | ||
items .updated_at AS alias_0, | ||
shops .order_number AS alias_1, | ||
items .id | ||
FROM | ||
items | ||
LEFT OUTER JOIN | ||
shops | ||
ON shops .id = items .shops_id | ||
ORDER BY | ||
items .updated_at DESC, | ||
shops .order_number , | ||
LIMIT 5 OFFSET 0 | ||
``` | ||
ふたつめ | ||
``` | ||
SELECT | ||
items .id AS t0_r0, | ||
items .name AS t0_r1, | ||
items .shop_id AS t0_r2, | ||
items .updated_at AS t0_r3, | ||
FROM | ||
items | ||
LEFT OUTER JOIN |
`shops` ON `shops`.`id` = `items`.`shops_id`
WHERE items
.id
IN(108, 108, 108, 108, 108)
ORDER BY
items
.updated_at
DESC,
shops.order_number
**whereで同じIDをいくつもとってしまっています。** 一つ目のSQLでorder_numberも見てしまっているので、DISTICTしても重複データとして削除されていない。 要はitemsのひとつひとつにshopsが紐付いていて、そのshopsたちでorder_numberが異なるため、同じIDのもの(紐付いているshops分)ができてしまっています。 これの解決策を教えていただければと思います。
あなたの回答
tips
プレビュー