为了简单起见,我避免使用enum作为属性,而是存储字符串值。
我列出了数组中预定顺序的所有可能值:MyTypeEnum.names
我在my_recs = MyModel.order(:my_type)
在my_recs中按照myTypeEnum.names中的值数组指定的顺序对my_type属性值中的记录进行排序的最佳方法是什么?
我可以试试这个:
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的顺序进行硬编码)
答案 0 :(得分: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
和:c
,ordered_recs
初始化为Hash
Arrays
键按上述每个符号
irb(main):002:0> Hash[MyTypeEnum.names.map { |v| [v, []] }]
=> {:a=>[], :b=>[], :c=>[]}
根据Array
中的密钥将记录附加到正确的Hash
,然后当所有记录正确分组时,将数组连接/展平为一个记录列表。