17

データベース呼び出しから作成した Assignment オブジェクトの配列があります。

@assignments = @player.assignments 

私はこれでそれらを数えたい:

@assignments.count {|x| x.sets == 0.0}

これにより、割り当ての数が 0.0 セットでカウントされます。ただし、これは常に @assignments 内のオブジェクトの総数を返します。私はそれを確認しました

@assignments.each {|x| puts x.sets == 0.0}

すべての場合に true を返すわけではありません。手がかりはありますか?

編集>

@assignments.map(&:sets)
=> [35.0, 120.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 75.0, 0.0, 0.0, 0.0, 0.0] 
4

3 に答える 3

26

ほとんどの場合、インスタンスで@assignmentsはありませんが、試してみてください。その場合、メソッドは期待どおりに機能せず、レコード数を返します。ArrayActiveRecord::Relation@assignments.classcount

試す

@assignments.where(sets: 0).count

または(最初に配列に変換する)

@assignments.to_a.count {|x| x.sets == 0.0}
于 2013-08-19T08:39:21.377 に答える
2

これを試してください:

    @assignments.select {|x| x if x.sets == 0.0}.count

ありがとう

于 2013-08-19T08:30:52.537 に答える
0

count を参照するか、単にオブジェクトの数のみをカウントします (内部的に、オブジェクトが存在するかのように各オブジェクトをチェックし、nillfalse を返す場合は true を返すため、実際にtrueはブロックによって返される数をカウントします)、条件が成立する回数をカウントしたい場合injectは、ルビーでのみこれらのタイプの計算用に作成されたイテレータを使用することをお勧めします。

このようになります

@assignments.inject(0) {|sum,x| 
  if x.sets == 0.0
    sum + 1
  else
    sum
  end
}
于 2013-08-19T08:31:46.723 に答える