2013-08-01 26 views
7

Tôi muốn sắp xếp hồ sơ của tôi trong một ứng dụng ray:của Ruby Sắp xếp theo (số nguyên) "So sánh NilClass với 3200 thất bại"

@ebms = Ebm.all 
@ebms.sort_by! {|u| u.number} 

Các u.number được định nghĩa là số nguyên! Vấn đề là Rails không thể so sánh nó với nil:

comparison of NilClass with 32400 failed 

gì tôi có thể làm gì để tránh lỗi này?

+0

Có phải 'số' là trường trong cơ sở dữ liệu không? – toro2k

+0

Để tránh sự cố này trong tương lai, bạn có thể muốn thêm xác thực vào mô hình để đảm bảo rằng các bản ghi không có thuộc tính 'số' không thể được tạo (nếu điều này có ý nghĩa đối với ứng dụng của bạn). –

Trả lời

6

Làm thế nào để thử chuyển đổi số không thành số nguyên?

@ebms = Ebm.all 
    @ebms.sort_by! { |u| u.number.to_i } 
+0

nó có ý nghĩa gì không –

+1

Điều đó có ý nghĩa, nhưng không khác nhiều so với câu trả lời của Matt, vốn đã sớm hơn. Đó là một cách viết tốt hơn một chút. – sawa

+0

Vấn đề này cũng xảy ra tại 'min_by' và ở đó tôi thích Matts trả lời. – Mindbreaker

12

Bạn có thể thêm một giá trị mặc định cho việc so sánh sẽ được sử dụng khi number là con số không:

@ebms = Ebm.all 
@ebms.sort_by! {|u| u.number || 0} 

Hoặc bạn có thể làm theo những gợi ý in this answer để chọn những người có số lượng và sắp xếp chúng, sau đó thêm những người không một số vào danh sách.

+0

Tùy thuộc vào nhu cầu của OP mặc định có thể là một số rất nhỏ của một số rất lớn. – sawa

+0

Điều gì sẽ xảy ra nếu một số 'u.number' trả lại số âm? – toro2k

+2

@ toro2k Trong trường hợp này, nếu OP muốn các trường hợp nil được sắp xếp đầu tiên, thì mặc định sẽ là '-Float :: INFINITY'. – sawa

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