2013-02-18 116 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,然后当所有数据都正确分组时,数组将被连接/拼合成单个记录列表。

相关问题