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

  • 77
    いいね
  • 5
    コメント
この記事は最終更新日から1年以上が経過しています。

例えば、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 さんに教えていただきました。ありがとうございます。