2014-09-24 48 views
-1

是否查询:.where('IN(?)',array)总是按顺序返回记录吗?

company_ids = [2,6,15,1,3] 

@people = Person.where("company_id IN (?)", company_ids) 

总是回报@peoplecompany_ids数组排序?

如果不是,那会是增加最佳实践的.order()像:

c_ids = company_ids.collect{|c_id| "company_id = #{c_id}"} 

@people = Person.where("company_id IN (?)", company_ids).order(c_ids.join(',')) 
+0

如果没有指定排序明确,那么它不能保证。 – 2014-09-24 16:04:13

+0

@SergioTulentsev我试图避免做不必要的排序性能开销。谢谢你的评论。 – sscirrus 2014-09-24 16:05:17

+0

如果您按顺序排列了记录,那么您最好对它们进行排序。或者在生产中断时半夜醒来。 :) – 2014-09-24 16:06:43

回答

0
@people = Person.where("company_id IN (?)", company_ids).order(id: :desc).map(&:id) 

没有测试可以请你试试这个。

+0

您不是按给定数组订购'company_id',而是通过降序'id'进行排序,然后收集这些ID。 – sscirrus 2014-09-24 16:19:29

-1
@people = Person.where("company_id IN (?)", company_ids).order("company_id") 

这将确保您始终拥有@people,由company_id订购。请评论,如果你期待别的东西。

+0

根据升序company_id命令'Person'。我需要company_id的顺序来完全匹配'company_ids'数组。 – sscirrus 2014-09-24 18:35:59

+0

哦酷,因为你只是添加“sort_by”,下面是代码。 '@people = Person.where(“company_id IN(?)”,company_ids).sort_by {| x | company_ids.index x.company_id}' – TarunJadhwani 2014-09-24 18:42:39

0

不,它不。

您可以在SQL中完成,但查询语法将取决于您使用的数据库。对于MySQL这样的事情应该工作:

@people = Person.where("company_id IN (?)", company_ids).order("field(company_id, #{company_ids.join(',')})") 

我不认为有一个简单的方法来做到这一点在PostgreSQL的,但除非你有几百万行的,你可以做排序在Ruby中:

index = Person.where("company_id IN (?)", company_ids).group_by(&:company_id) 
@people = company_ids.map{|id| index[id]}.flatten 

---编辑---

这就是你如何能做到同样的PostgreSQL中:

Person.where("company_id IN (?)", company_ids).order("CASE #{company_ids.map{|id| "WHEN company_id='#{id}' THEN #{company_ids.index(id)}"}.join(' ')} END;") 
+0

我需要'@ people'作为排序关系,这是PostgreSQL。 – sscirrus 2014-09-24 19:12:53

+0

增加了一个PostgreSQL查询的小怪物,应该可以做你需要的。 – makhan 2014-09-25 02:02:42