-1

オブジェクトの配列、タイプLab、、existing_labsおよび別のLabの配列、new_labs。ラボ用に独自の==コンパレータを定義しました。

existing_labsはデータベースにすでに存在するラボです。 new_labsすでにデータベースに存在することに基づいて、保存されるラボです。

今私はこれをやっています

new_labs.each do |l|
  lab = Lab.new(l)
  exists = existing_labs.map{ |existing_lab| lab == existing_lab }
  lab.save unless exists.include? true
end

これは機能しますが、アレイのいずれかまたは両方が大きい場合は遅くなる可能性があります。これを行うにはもっと良い方法が必要だと確信しています!

明確にするために編集:

私の質問は、私の方法を使用して、に存在するが存在しnew_labsないすべてのラボを返す良い方法はありますか?existing_labs==

4

5 に答える 5

1

あなたの質問はまったく明確ではありませんが、コードのリファクタリングは次のとおりです。

(new_labs.map{|l| Lab.new(l)} - existing_labs).each(&:save)
于 2013-02-04T17:30:43.960 に答える
1
new_labs.each do |l|
  lab = Lab.new(l)
  lab.save unless existing_labs.any?{|existing_lab| lab == existing_lab }
end

ラボごとに true と false の配列が作成されないため、多少高速になるはずです。また、見つかっany?たら終了しtrueます。

于 2013-02-04T20:26:47.667 に答える
0

-次の方法を使用できます。

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,3]
> ary1 - ary2
=> [1, 4, 5]

もう1つ:

ary1.select { |e| not ary2.include? e }

これらの方法はいずれもバックグラウンドでの反復を意味しますが、この方法は-パフォーマンスに勝ると思います。おそらく、いくつかのベンチマークが適切でしょう。

于 2013-02-04T17:28:13.453 に答える
0

array2 にない array1 の要素を返します

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary1 - ary2
=> [1, 4, 5]

array1 にない array2 の要素を返します

> ary1 = [1, 2, 3, 4, 5]
> ary2 = [2,7,9,3]
> ary2 - ary1
=> [7,9]
于 2013-02-04T18:32:12.837 に答える
0

それらからセットを作成し、メソッドを適用しますdifference

于 2013-02-04T17:26:38.460 に答える