2014-02-28 46 views
2

对我送的ID的数组控制器params[:ids] = [2,5,9,...]排序无序的SQL结果基于原始数组顺序

现在如果我执行像Device.find(params[:ids])的结果是基于数据库排序的查询。我如何根据原始数组排序结果,所以带有id 2的设备首先等等?

+0

@ toro2k这不重复。使用Ruby不是排序SQL结果的唯一方法。 – Agis

+0

你在使用哪个数据库? – Agis

回答

3

你可以看看了id的指数与Array#index

ids = params[:ids] 
Device.find(ids).sort_by { |device| ids.index(device.id) } 
1

您只需通过使用SQL做到这一点:

Device.where(params[:ids]).order("field(id, #{params[:ids].map(:to_i).join(',')})") 

这将是比用Ruby做更快。

+4

这不容易被SQL注入吗? – Stefan

+0

@Stefan现在不再是。 – Agis

+0

函数'field'在哪个DBMS上工作?我试过postgres和sqlite,但都没有定义它。 – toro2k