0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】in_order_ofがもっと便利になった

Posted at

概要

in_order_ofというメソッドがある

使い方
モデル.in_order_of(カラム, )

こんな感じで使う

User.in_order_of(:id, [2, 3, 1])

順序を指定して並び替えができる便利メソッド

上のコードを実行すると、このような配列を取得できる

[#<User:0x0000ffff84edde90 id: 2, created_at: "2024-12-15 04:19:33.799418000 +0000", updated_at: "2024-12-15 04:19:33.799418000 +0000">,
 #<User:0x0000ffff84eddd50 id: 3, created_at: "2024-12-15 04:19:33.803428000 +0000", updated_at: "2024-12-15 04:19:33.803428000 +0000">,
 #<User:0x0000ffff84eddc10 id: 1, created_at: "2024-12-15 04:19:33.791725000 +0000", updated_at: "2024-12-15 04:19:33.791725000 +0000">]

idが2, 3, 1の順に並び、それ以外のレコードはフィルタされている

8.0以降

filterという引数を渡せるようになった
これは、値としてわたした条件以外のレコードも取得するもの

User.in_order_of(:id, [2, 3, 1], filter: false)

実行してみる

app(dev)> User.in_order_of(:id, [2, 3, 1], filter: false)
  User Load (6.9ms)  SELECT `users`.* FROM `users` /* loading for pp */ ORDER BY CASE WHEN `users`.`id` = 2 THEN 1 WHEN `users`.`id` = 3 THEN 2 WHEN `users`.`id` = 1 THEN 3 ELSE 4 END ASC LIMIT 11
=>
[#<User:0x0000ffff84ee9c40 id: 2, created_at: "2024-12-15 04:19:33.799418000 +0000", updated_at: "2024-12-15 04:19:33.799418000 +0000">,
 #<User:0x0000ffff84ee9b00 id: 3, created_at: "2024-12-15 04:19:33.803428000 +0000", updated_at: "2024-12-15 04:19:33.803428000 +0000">,
 #<User:0x0000ffff84ee99c0 id: 1, created_at: "2024-12-15 04:19:33.791725000 +0000", updated_at: "2024-12-15 04:19:33.791725000 +0000">,
 #<User:0x0000ffff84ee9880 id: 4, created_at: "2024-12-15 04:19:33.818582000 +0000", updated_at: "2024-12-15 04:19:33.818582000 +0000">,
 #<User:0x0000ffff84ee9740 id: 5, created_at: "2024-12-15 04:19:33.820695000 +0000", updated_at: "2024-12-15 04:19:33.820695000 +0000">,
 #<User:0x0000ffff84ee9600 id: 6, created_at: "2024-12-15 04:19:33.825088000 +0000", updated_at: "2024-12-15 04:19:33.825088000 +0000">,
 #<User:0x0000ffff84ee94c0 id: 7, created_at: "2024-12-15 04:19:33.829939000 +0000", updated_at: "2024-12-15 04:19:33.829939000 +0000">,
 #<User:0x0000ffff84ee9380 id: 8, created_at: "2024-12-15 04:19:33.834391000 +0000", updated_at: "2024-12-15 04:19:33.834391000 +0000">,
 #<User:0x0000ffff84ee9240 id: 9, created_at: "2024-12-15 04:19:33.836578000 +0000", updated_at: "2024-12-15 04:19:33.836578000 +0000">,
 #<User:0x0000ffff84ee9100 id: 10, created_at: "2024-12-15 04:19:33.840795000 +0000", updated_at: "2024-12-15 04:19:33.840795000 +0000">]

2, 3, 1以外のレコードも取得されるようになった

// filter: true
SELECT `users`.* FROM `users` WHERE `users`.`id` IN (2, 3, 1) /* loading for pp */ ORDER BY CASE WHEN `users`.`id` = 2 THEN 1 WHEN `users`.`id` = 3 THEN 2 WHEN `users`.`id` = 1 THEN 3 END ASC LIMIT 11

// filter: false
SELECT `users`.* FROM `users` /* loading for pp */ ORDER BY CASE WHEN `users`.`id` = 2 THEN 1 WHEN `users`.`id` = 3 THEN 2 WHEN `users`.`id` = 1 THEN 3 ELSE 4 END ASC LIMIT 11

filter: falseにするとWHERE users.id IN (2, 3, 1)が消えている

地味にありがたい変更なので覚えておきたい

実装されたPR

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?