2012-01-05 22 views
21

Tôi biết rằng boolean trong Ruby là các lớp. Nhưng từ quan điểm thực tế, có cách nào để sắp xếp một mảng bằng boolean (tức là, với tất cả các phần tử có giá trị thực đầu tiên) không?sort_by với Boolean trong Rails

Cảm ơn bạn.

Trả lời

65

Bạn có thể lừa gạt và làm cho nó trở lại một số:

sort_by { |a| a.thing ? 0 : 1 } 
+1

những mẹo này ... cảm ơn rất nhiều –

15

Bạn có thể sử dụng phân vùng và sau đó san bằng kết quả:

partition{|v| v == true}.flatten 
+0

Tôi nghĩ câu trả lời này thể hiện ý định hơn .... –

+3

Nếu bạn muốn ở bên an toàn và tránh bất kỳ thay đổi ngoài ý muốn nào, bạn có thể muốn sử dụng 'flatten (1) '. Tuy nhiên, nếu bạn biết rằng các phần tử không thể được làm phẳng, thì mã ở trên là tốt vì nó ngắn gọn hơn. http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten –

6

Bằng cách sử dụng ActiveRecord's order (bao gồm trong Rails):

collection.order(thing: :desc) 
+0

Câu trả lời hay nhất! Hãy thực hiện thứ tự trên phía SQL chứ không phải trong các bản ghi đã truy xuất. – Roman

4

Vì có một số cách khác nhau được trình bày ở đây, tôi đã tiếp tục và đánh giá chúng để xem nhanh nhất là gì, sắp xếp 27.000 mục dựa trên thuộc tính boolean:

Rehearsal --------------------------------------------- 
sort_by  0.070000 0.000000 0.070000 ( 0.075203) 
partition 0.110000 0.000000 0.110000 ( 0.114667) 
order  0.000000 0.000000 0.000000 ( 0.000046) 
------------------------------------ total: 0.180000sec 

      user  system  total  real 
sort_by  0.010000 0.000000 0.010000 ( 0.016611) 
partition 0.110000 0.000000 0.110000 ( 0.111384) 
order  0.000000 0.000000 0.000000 ( 0.000047) 

Vì vậy, giữ mọi thứ ở phía SQL chắc chắn làm mọi việc nhanh hơn.

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