按预定列表订购记录的最佳方式

时间:2013-02-18 15:55:26

标签: ruby-on-rails rails-activerecord

为了简单起见,我避免使用enum作为属性,而是存储字符串值。

我列出了数组中预定顺序的所有可能值:MyTypeEnum.names

我在my_recs = MyModel.order(:my_type)

中有一个ActiveRecord :: Relation记录列表

在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的顺序进行硬编码)

1 个答案:

答案 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:cordered_recs初始化为Hash Arrays键按上述每个符号

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

根据Array中的密钥将记录附加到正确的Hash,然后当所有记录正确分组时,将数组连接/展平为一个记录列表。