2013-08-19 38 views
12

Tôi có một mảng các đối tượng chuyển nhượng mà tôi tạo ra từ một cuộc gọi cơ sở dữ liệu:Array.count với khối không trả lại câu trả lời đúng

@assignments = @player.assignments 

Tôi muốn đếm chúng với điều này:

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

Điều này sẽ đếm số lượng bài tập với 0,0 bộ. Tuy nhiên, điều này luôn trả về tổng số đối tượng trong @assignments. Tôi đã kiểm tra xem

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

không trả lại đúng trong tất cả các trường hợp. Bất kỳ manh mối nào?

Edit>

@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] 
+0

Sử dụng 'select' đầu tiên và sau đó' count'. –

+0

Bạn có thể hiển thị đầu ra của '@ assignments.map (&: sets)' không? –

+0

Nó hoạt động cho tôi '[1] nâng lên (chính)> bài tập = [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] => [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] [2] pry (chính)> assignments.count {| x | x == 0.0} => 9 [3] pry (chính)> assignments.count => 13' –

Trả lời

19

Nhiều khả năng, @assignments không phải là một thể hiện Array, nhưng ActiveRecord::Relation, hãy thử @assignments.class. Nếu vậy, phương pháp count không hoạt động như bạn mong đợi, nó sẽ trả về số lượng bản ghi.

Hãy thử

@assignments.where(sets: 0).count 

Hoặc thậm chí (chuyển sang mảng đầu tiên)

@assignments.to_a.count {|x| x.sets == 0.0} 
+1

+1. Điều này rất có thể, một lỗ hổng phổ biến ... – tokland

+0

Nó được trả về bằng phương thức Rails ActiveRecord. Nhưng @ assignments.class trả về mảng. Nhưng giải pháp của bạn làm việc cho tôi, vì vậy tôi đoán nó là như bạn nói. Cảm ơn bạn rất nhiều! – user1742188

+0

@ user1742188: Rails 2? Nó có thể nói "Array" nhưng nó không phải là một mảng đơn giản. Một trong những hack vô số may mắn đang được giải quyết trong các phiên bản latests. – tokland

1

Hãy thử với điều này:

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

Cảm ơn

+0

Câu trả lời này hoạt động khi bạn muốn sử dụng một phương thức để trả về số đếm. Có nghĩa là, nếu bạn không đếm dựa trên thuộc tính của đối tượng, mà là dựa trên phương thức. Ví dụ: 'people.select {| person | người nếu person.tall?}.count' – singularity

+0

@singularity '.select () .count' thực sự giống như' count () ', chỉ một chút tiết hơn. –

0

thấy đếm hoặc từng chỉ đếm số lượng các đối tượng chỉ (nội nó kiểm tra cho từng đối tượng như thể đối tượng sẽ có mặt nó sẽ trả về true nếu nill của nó sẽ trả về false, vì vậy thực sự nó đếm số lượng true được trả về bởi khối), nếu bạn w ant để đếm số lần tình trạng của bạn đúng, tôi khuyên bạn nên thử sử dụng trình lặp vòng inject được tạo cho các loại tính toán này chỉ trong ruby.

Nó sẽ như thế này

@assignments.inject(0) {|sum,x| 
    if x.sets == 0.0 
    sum + 1 
    else 
    sum 
    end 
} 
+1

[không đúng, ít nhất là số lượng của ruby] (http://ruby-doc.org/core-2.0/Array.html#method-i-count) –

+0

@ user1742188 bạn sẽ thử cái này quá một lần. – dirtydexter

+0

Trong trường hợp đó, bạn nên chỉnh sửa câu trả lời của mình cho phù hợp, vì như tôi nói, mặc định 'đếm' hoạt động chính xác như OP muốn nó đến –

Các vấn đề liên quan