2010-11-18 2 views
0

私は1000個のユーザーオブジェクトを.eachループで処理しています。1000回の処理を.eachループで処理する方法、putsメッセージを100項目ごとに出力する方法は?

私はフィードバックのためのputsメッセージをコンソールに出力します。

どうすればいいですか、Rubyモジュラス演算子は何ですか?

私が試み:

if u.id % 100 
    puts u.id.to_s 
end 
+2

あなたは正しい考えを持っていますが、Rubyで「falsey」のみのものは 'false'をと' Nil'です。 「0」は実際に「真実」なので、フィリップのようにモジュラスがゼロに等しいかどうかを明示的にチェックする必要があります。また、あなたのアイデアは、100アイテムごとに1回ではなく、100アイテムごとに99アウトプットを供給していました。 –

答えて

7

はそれを試してみてください。

if u.id % 100 == 0 
    puts u.id.to_s 
end 
+1

私はコードゴルフのためにこれが好きです:) –

0

:-)オブジェクトの配列を列挙し、インデックス100%が99(または0との間の他の値と等しいかどうかを確認し、 99を含む)。

5

この意志ループ2000倍、標準っぽいメッセージを出力毎に100のループ:進行状況インジケータのその種に

1.upto(2000).with_index do |j,i| 
    print "line #{i}\r" if (i % 100 == 0) 
end 
print "\ndone\n" 

代替は、次のとおり

print '.' if (i % 100 == 0) 

または単純なスピナー:

spinner = %w[ |/- \\ ] 
1.upto(n).with_index do |j,i| 
    print spinner.rotate![0], "\r" if (i % 100 == 0) 
    # some long running task 
end 
print "\ndone\n" 

- 0の場合は、データベースの行を読み取って作成されたActiveRecordオブジェクトから来ています。したがって、ソートがid列に基づいていない場合は、ループしながら大きく変化する出力を得ることができます。また、データベースがしばらく存在していて、行を削除していた場合は、ギャップがid個ある可能性があります。最終的な結果はあなたの「100回ごと」が非常に不正確かもしれません。

私はidと比較しないことをお勧めしますし、代わりにあなたのループとしてあなたがインクリメント別の変数を使用するか、またはあなたの% 100 == 0テストのために使用することができ、一貫インクリメント番号を提供するためにeach_with_indexまたは列挙のwith_indexを使用すると思います。

1

かわり.each.each_sliceを使用することができます。

rows.each_slice(100) do |slice| 
    slice.each do |row| 
     .... 
    end 
    puts message 
end 
関連する問題