[英]Best way to order records by predetermined list
為了簡單起見,我避免為屬性使用枚舉,而是存儲字符串值。
我在數組中以預定順序列出了所有可能的值: MyTypeEnum.names
我在my_recs = MyModel.order(:my_type)
有一個ActiveRecord :: Relation記錄列表
按myType屬性值按MyTypeEnum.names中的值數組指定的順序對my_recs中的記錄進行排序的最佳方法是什么?
我可以嘗試這樣:
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 :: Relation來降低性能? 有沒有更清潔的方法? (注意:我可能希望在排序方面具有靈活性,所以我不想假定該訂單是按照MyTypeEnum.names的順序進行硬編碼的)
通過對MyTypeEnum
每個項目進行單獨的查詢, 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
和:c
,則使用上述每個符號作為鍵的Arrays
Hash
來初始化ordered_recs
irb(main):002:0> Hash[MyTypeEnum.names.map { |v| [v, []] }]
=> {:a=>[], :b=>[], :c=>[]}
根據Hash
的鍵,將記錄添加到適當的Array
中,然后在對所有數組進行適當分組后,將這些數組連接/合並為一個單獨的記錄列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.