2

単純にするために、属性に列挙型を使用することを避け、代わりに文字列値を格納しています。

配列内のすべての可能な値のリストを事前に決められた順序で持っています。MyTypeEnum.names

そして、レコードの ActiveRecord::Relation リストがありますmy_recs = MyModel.order(:my_type)

MyTypeEnum.names の値の配列で指定された順序で、 my_recs のレコードを :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 の順序でハードコードされているとは想定したくありません)

4

1 に答える 1

1

のすべてのアイテムに対して個別のクエリを実行することで、確実にパフォーマンスが低下しますMyTypeEnum。これに必要なクエリは 1 つだけです (一度にすべてのレコードを取得します)。

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_recsHashArrays

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

Arrayレコードはのキーに基づいて適切に追加され、Hashすべてが適切にグループ化されると、配列が連結/フラット化されて単一のレコード リストになります。

于 2013-02-18T16:19:39.710 に答える