簡體   English   中英

按預定列表排序記錄的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM