2017-04-19 12 views
0

特定の属性を持つオブジェクトのコレクションがあります。 私はまた、定数の配列を持っています。定数配列とオブジェクト配列の比較

定数配列に存在するidを持つオブジェクト全体を返したいとします。

これは私がこれまで持っているものであるが、それは単にそれぞれのtrueまたはfalseを返し、私はそれがすべてのオブジェクトの配列を返す必要があります。

some_object_attributes.collect { |attr| (Constant::SOME_IDS.include? attr.object.object_type_id)} 

は、どのように私は持っているすべてのattr.objectを返すことができます。定数配列のID?

+0

定数にはいくつのIDがありますか?オブジェクト配列のサイズは?配列の代わりに 'Set'を使うと、パフォーマンスが大幅に向上する可能性があります。 – spickermann

+1

これは、クエリパラメータにすることはできません理由はありますか? 'scope:in_constant_array、 - > {where(object_type_id:Constant :: SOME_IDS)}'のようなものであれば、memではなく、持ち上げを行うためにSQLを利用することができます – engineersmnky

+0

定数に12個ほどのIDがあります。 – user3437721

答えて

3

collect(別名map)はブロックの結果を返します。ブロックの結果に基づいて、コレクション内のオブジェクトを返したいとします。そのため、selectがあります:ちょうど好奇心のうち

some_object_attributes.select do |attr| 
    Constant::SOME_IDS.include? attr.object.object_type_id 
end 
0

collectの代わりにselectを使用してください。

collectは、評価結果(trueまたはfalse)を返しています。 selectはオブジェクトを返します。

このarticleが有効です。

3

、本当に巨大な配列のためにそれがより速くなるかもしれない方法:

some_object_attributes.group_by do |attr| 
    attr.object.object_type_id 
end.values_at(*Constant::SOME_IDS).flatten 

これはO(N)あるそれはのためにConstant::SOME_IDS配列を調べていないので、各要素。

+0

アルゴリズムの複雑さを吸いますが、 'values_at'では似たようなことはしません。反復とマッチングです。 Rubyでは確かに高速ですが、コストにはまだ影響します。 – coreyward

+0

@coreywardそれはハッシュを探します、それはO(1)であることが約束されています。 – mudasobwa

+0

ハッシュルックアップテーブルをビットごとのハッシュで分割し、フルテーブルをスキャンしないため、そうです。驚くばかり。 – coreyward