2009-03-18 20 views
27

Tôi có một ví dụ nhỏ về ứng dụng Rails được gọi là vé, xem và chỉnh sửa vé hư cấu được bán cho nhiều khách hàng khác nhau. Trong tickets_controller.rb, bên def index, tôi có dòng này tiêu chuẩn, được tạo ra bởi giàn giáo:Bạn thường sắp xếp các mục trong Rails như thế nào?

@tickets = Ticket.find(:all) 

Để sắp xếp vé theo tên, tôi đã tìm thấy hai cách tiếp cận tốt. Bạn có thể làm theo cách này:

@tickets = Ticket.find(:all, :order => 'name') 

... hoặc theo cách này:

@tickets = Ticket.find(:all).sort!{|t1,t2|t1.name <=> t2.name} 

(Mẹo: tài liệu của Ruby giải thích rằng sort! sẽ sửa đổi mảng mà nó được phân loại, như trái ngược với một mình sort , trả về mảng đã sắp xếp nhưng để nguyên bản gốc).

Bạn thường sử dụng chiến lược nào? Khi nào bạn có thể sử dụng .sort! so với cú pháp :order => 'criteria'?

Trả lời

34

Sử dụng :order => 'criteria' để biết mọi thứ đơn giản có thể được thực hiện bởi cơ sở dữ liệu (ví dụ: thứ tự bảng chữ cái hoặc thứ tự cơ bản). Rất có thể nó nhanh hơn rất nhiều so với việc cho phép mã Ruby của bạn làm điều đó, giả sử bạn có các chỉ mục phù hợp.

Thời gian duy nhất tôi có thể nghĩ bạn nên sử dụng phương pháp sort là nếu bạn có thuộc tính phức tạp được tính toán trong thời gian chạy và không được lưu trữ trong cơ sở dữ liệu, như 'giá trị đáng tin cậy' dựa trên số lượng phản hồi tốt/xấu hay gì đó. Trong trường hợp đó, tốt hơn nên sử dụng phương thức sort, nhưng hãy lưu ý rằng điều này sẽ làm hỏng mọi thứ nếu bạn có phân trang tại chỗ (mỗi trang sẽ có kết quả ITS theo thứ tự, nhưng tập hợp các trang sẽ không theo thứ tự) .

+0

Thú vị. Tại sao nó sẽ vít lên phân trang nếu, ngay sau khi tôi kéo thông tin từ cơ sở dữ liệu, tôi sắp xếp! nó? Điều đó sẽ không xảy ra trước khi nó được chuyển đi để phân trang/hiển thị? –

+4

Cuộc gọi tìm/paginate sẽ nhận dữ liệu theo khối (cho phép nói) 20. 20 sẽ được chọn ra khỏi cơ sở dữ liệu theo bất cứ điều gì: mệnh đề thứ tự bạn có, THEN được sắp xếp theo chức năng sắp xếp tùy chỉnh của bạn. Điều này có nghĩa là tập hợp trang sẽ được sắp xếp theo mệnh đề: thứ tự và mỗi trang theo chức năng của bạn. – Luke

+0

Cảm ơn lời giải thích tuyệt vời! –

2

Tôi chỉ định một đơn đặt hàng trong công cụ tìm ActiveRecord hoặc trong liên kết mô hình vì sắp xếp bằng SQL nhanh hơn. Bạn nên tận dụng các tính năng được cung cấp bởi RDBMS khi bạn có thể làm như vậy.

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