2

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

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

我有一个 ActiveRecord::Relation 记录列表my_recs = MyModel.order(:my_type)

以 MyTypeEnum.names 中的值数组指定的顺序通过它们的 :my_type 属性值对 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 的顺序硬编码的)

4

1 回答 1

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,用上述每个符号键控的aordered_recs初始化HashArrays

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

Array记录根据它在 中的键附加到正确的位置Hash,然后当所有这些都被正确分组后,数组被连接/展平到一个单一的记录列表中。

于 2013-02-18T16:19:39.710 回答