2014-09-24 31 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