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