2013-02-18 62 views
2

爲了簡單起見,我避免使用屬性的枚舉,而是存儲字符串值。按預定列表排序記錄的最佳方法

我有所有可能的值在陣列中的一個預定的順序列表:MyTypeEnum.names

而且我有記錄在my_recs = MyModel.order(:my_type)

什麼是訂單記錄的最好辦法一個ActiveRecord ::關係列表在my_recs中通過my_type屬性值按MyTypeEnum.names中值的數組指定的順序排序?

我可以試試這個:

my_recs = MyModel.order(:my_type) 
ordered_recs = [] 
MyTypeEnum.names.each do |my_type_ordered| 
    ordered_recs << my_recs.where(:my_type => my_type_ordered) 
end 

但我會通過構建一個數組,而不是使用的ActiveRecord ::關係查殺性能?有更清潔的方法嗎? (注意:我可能希望在訂購時具有靈活性,所以我不想假定訂單按照MyTypeEnum.names的順序如上所述進行硬編碼)

回答

1

通過執行單獨的查詢對於MyTypeEnum中的每個項目。這隻需要一個查詢(一次抓取所有記錄)。

ordered_recs = Hash[MyTypeEnum.names.map { |v| [v, []] }] 

MyModel.order(:my_type).all.each do |rec| 
    ordered_recs[rec.my_type] << rec 
end 

ordered_recs = ordered_recs.values.flatten 

如果MyTypeEnum包含:a:b,和:cordered_recs是基於它與的Arrays一個Hash由上述各符號

irb(main):002:0> Hash[MyTypeEnum.names.map { |v| [v, []] }] 
=> {:a=>[], :b=>[], :c=>[]} 

中的記錄被追加到適當Array的鍵控初始化鍵入Hash,然後當所有數據都正確分組時,數組將被連接/拼合成單個記錄列表。

相關問題