139
112

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL+ActiveRecordで、与えられた配列順にorderしたい時

Last updated at Posted at 2013-09-06

例えば、RedisのSorted setなど、別のモデルから取ってきた順序に意味のあるID列があったとする。

ids = [5, 2, 10]

で、このIDの順に取得したい場合、mysqlを使っているならこう書ける

SELECT id FROM model
 WHERE id IN (5, 2, 10)
 ORDER BY FIELD(id, 5, 2, 10)

ただ、これをActiveRecordでやろうとする時、自分でsanitizeする必要がある。

sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, ["field(id ,?)",ids])
Model.where(id: ids).order(sanitized_query)

[2015/11/15追記]
Railsのv4.2.5以降では v4.2.5にはまだ入っていませんでしたが、masterには反映されているようです。

Model.where(id: ids).order(['field(id, ?)', ids])

と書けるようになりました。

@jnchito さんに教えていただきました。ありがとうございます。

139
112
6

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
139
112

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?