2016-10-13 2 views
1

ruby​​でrejectメソッドを使用しようとしていますが、一定の回数後に停止する必要があります。例RubyやRubyのRubyでカウンタを使用するには

users = Users.all # this will be list of 1000 users 

count = 0 
user.reject! do |user| 
user.name == 'python' 
end 

のために私はカウントが100に達したときに拒否条件を停止したいので、

count = 0 
user.reject! do |user| 
    user.name == 'python' 
    count += 1 
    if count == 100 
    break 
    end 
end 

のようなものは、私は上記の構文が間違っている同意し、そしてあなたからいくつかの助けを必要としています。私はかなり新しいルビーですので、私は助けを感謝します。おかげ

+3

'user.name = 'python''これはユーザー名に' python'という名前を割り当てています...それは何ですかあなたは欲しいですか?実際には '' python '== user.name'(つまり、ユーザ名がPythonの場合は拒否します)をしますか?私が行ったことを周りに置いた場合は、文字列に値を代入することができないので、 '='/'=='にエラーがあったときに通知する可能性が高くなります(少なくともこの方法ではありません) –

+0

質問が更新されました – python

答えて

3

reject方法はtrueまたはfalseに評価ブロックを取り、それがtrueと評価され、すべての要素を拒否します。

ブロック内に他のコードがあると、rejectが誤動作します。

私はそれを行うための方法を2つにusers配列を分割することであると思う:

first_users = users[0...100] 
last_users = users[100...1000] 

100最初と最後の900さて、あなたはfirst_usersrejectメソッドを使用して、配列を組み合わせることができます。

first_users.reject! do |user| 
    user.name == 'python' 
end 

お知らせ代わり===。ブロック内にブール式が必要です。

最後に、あなただけの配列を一緒に追加

users = first_users + last_users 

あなたが最初の100個の要素のそれぞれを通るいるだろうループ、99から0にカウンターを実行することができ、および削除EDIT

条件に一致するもの

99.downto(0).each do |i| 
    users.delete_at(i) if users[i].name == 'python' 
end 
+0

['first'](https://ruby-doc.org/core-2.3.1/Array.html#method-i-first)と[' last' ](https://ruby-doc.org/core-2.3.1/Array.html#method-i-last)のように、 'first(100)'や 'last(900)'のように。さらに、 'first(100).reject! 'のようにチェーン化することができます。 ... ' – tadman

+0

カウント変数は、オブジェクトを拒否するたびにカウントされ、カウント値が特定の数値に達した場合にブレークアウトされます。私の場合は100です。ブロックをデータベースに分割する必要はありません。 – python

+0

私は 'reject'メソッドがそれほどうまくいかないと言っています。はい、count変数はカウントアップします。ループが100になるとループが壊れますが、何も拒否されていないことに気付き、元のリストに終わります。 – davidhu2000

2

またUser.allそうだが、それはそう多くのデータサーバーがクラッシュするで読み込むことができますようall危険なで呼び出して、覚えています。何をしたい

はおそらくです:

User.where.not(name: 'python').order(:id).limit(100) 

これは、IDの順に名前pythonを持っていない最初の100人を選択します。 Ruby層を打つ前にできるだけ多くのフィルタリングをデータベースで試してみてください。

あなたのコードのエラーはあなたが割り当てを済ませたことです。それが動作するので、これを書き換えるには:私は、これは非常に非効率的である述べてきたように

User.all.reject do |user| 
    user.name == 'python' 
end.first(100) 

、それが理由もなく、メモリのトンを使用し、実際に利用者の非自明な数字のためにサーバーをクラッシュする可能性がありますけど。

編集:あなたがここに'python'名前の最初の100人をマスクしたい場合は、行く:

User.all.reject do |user| 
    case (user.name) 
    when 'python' 
    excluded += 1 
    excluded < 100 
    else 
    true 
    end 
end 

それがする必要があるために、むしろ奇妙なことです。

DELETE FROM users WHERE name='python' LIMIT 100 
+0

Userオブジェクトが影響を受けていることを確認するために 'User.all.reject!'が必要です – python

+0

'reject!'はインプレース修飾子であり、 'nil 'レコードが変更されていない場合。そのメソッドを連鎖させることはできません。 – tadman

+0

'count'はあなたがここでやろうとしている' database count'とは別です。最初にデータベースを使用することはできません。最後のメソッド – python

関連する問題