概要
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