2017-10-31 5 views
0

ActiveRecordの結果の繰り返し中に配列からアイテムを削除する最適な方法を探したいと思います。RailsでActiveRecordリレーションを反復するときに同様のレコードを削除する

データベースからではなく、配列からレコードを削除したいとします。だから私は例えばa.delete(レコード)を使用することはできません。

# find similar items @items in a AR relation array 
@items = Item.where("toto = ?", value).to_a 
@items.each do |i| 

    # match similar records using postgres 
    @similar_items = ... 

    # now try to remove similar items from original @items array 
    @similar_items.each do |similar_item| 

    # this seems to not work 
    @items.reject! { |item_to_remove| 
     item_to_remove == similar_item 
    end 

    end 

end 

は実際には、私の目標は、それらを繰り返すしないようにマッチした商品を使用して配列からすべての重複を削除することです。私はあなたに次のようなアプローチ提案する

+0

あなたは、文字通り同等の意味ですか、実行中の「類似性」機能はありますか? – tadman

+0

私はPostgresの類似(Ngrams)機能を使用しています。 –

+0

ここではまっすぐな '=='比較をしているので、これがどのように機能するのかは分かりません。 – tadman

答えて

0

  1. は、あなたがこれらの同様の項目を除外した
  2. 戻りコレクションのすべての同様の項目を収集します。

コードを単純化し、繰り返し回数を減らす必要があります。

@items = Item.where("toto = ?", value).to_a 

    similar_items = @items.reduce([]) do |r, i| 
     @similar_items = ... 
     (r + @similar_items).flatten 
    end 

    filtered_collection = @items.reject { |item| similar_items.include?(item) } 
+0

私は 'r + @ similar_items'という行を理解できません。行方不明? (暗黙的にnilをArrayに変換しない) –

+0

小さな修正が追加されました。一般的な考え方は、元の配列の_all_要素に対して_all_可能な類似の要素の配列を構築することです –

関連する問題