質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

587閲覧

【Rails】order句のときに発行されるDISTINCT句において、特定のカラムを除外したい

katahik

総合スコア79

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/11/24 11:49

前提・実現したいこと

ruby 2.6.5
Rails 6.0.4

Railsでアプリを作成しています。
リレーション先のモデルにあるカラムで並び替えをしたいのですが、order句の実行の際に、DISTICT句のSQOが発行され、それが思ったように動かず、同じIDのものをいくつも残してしまっています。
itemsの一覧画面に、そのitemに紐づくshopsの情報を羅列させたい(画像のように)のですが、SQL文がうまく生成されません。

イメージ説明

詳細

テーブル

items

IDnameshop_idupdated_at
1book12021/11/11
2pen22021/11/12
3notebook32021/11/13

shops

IDnameorder_number
1a_shop1
2b_shop2
3c_shop3
### コード
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分)ができてしまっています。 これの解決策を教えていただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neko_daisuki

2021/11/25 08:06

「ひとつめ」 で ID を取得して 「ふたつめ」 で絞り込みたいのでしょうか? items_controllers のコードと生成されたSQLが対応していないようで意図が分かりません。
katahik

2021/11/26 00:06

コメントありがとうございます。分かりづらい文となってしまいました。もう少し熟考して修正いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問