2011-08-19 46 views
6

Vì vậy, tôi có mẫu Photo có thể được tải xuống tại full_sizepresentation_size. Khi người dùng tải ảnh xuống, tôi theo dõi ảnh này trên thuộc tính full_downloadspresentation_downloads của ảnh.Đường ray: Đặt hàng theo tổng của hai cột

Tất cả đều tốt.

Đôi khi tôi muốn biết tổng số lượt tải xuống đã có. Tôi có một phương pháp đơn giản, total_downloads trông giống như vậy:

def total_downloads 
    self.full_downloads + self.presentation_downloads 
end 

Câu hỏi của tôi là: Tôi muốn để có thể đặt ảnh của cả ba trong số này (đầy đủ, trình bày, tổng tải). Hai cái đầu tiên rất dễ, nhưng làm thế nào để bạn thực hiện một đơn đặt hàng bằng tổng của hai cột? Lưu ý điều này cần phải là cả SQLite và PG tương thích ở mức tối thiểu.

Câu hỏi phụ, sẽ nhanh hơn khi đặt phương thức total_downloads là truy vấn và nếu đó là cách tốt nhất để viết câu hỏi đó là gì? Tôi biết để tổng hợp trên lớp bạn có thể gọi Photo.sum(...), nhưng tôi không chắc chắn làm thế nào để làm điều đó cho hai cột trên một bản ghi duy nhất.

Cảm ơn!

+0

Bạn có đồng ý với việc viết trực tiếp SQL hoặc đó có phải là vấn đề không? –

+0

@Devin M - Tôi sẽ làm những gì tôi phải làm :) – Andrew

Trả lời

16

Bạn có thể thử này:

Photo.order('full_downloads + presentation_downloads') 

Nó sẽ chạy truy vấn SQL này:

SELECT "photos".* FROM "photos" ORDER BY full_downloads + presentation_downloads 

Đây là khả năng chậm mặc dù. Nếu bạn có tập dữ liệu lớn và thường xuyên sử dụng thứ tự sắp xếp này, bạn nên cân nhắc việc tạo cột total_downloads và tính lại giá trị của cột nếu các thay đổi của cột ghi là full_downloads hoặc presentation_downloads.

+4

+1 Có tiềm năng chậm, nhưng vẫn chắc chắn nhanh hơn trong Ruby. –

+0

@Kirk: Đúng, đúng vậy :) – htanata

+0

Có vẻ ổn. Cảm ơn! – Andrew

3

Photo.order('full_downloads + presentation_downloads DESC')

Điều đó chắc chắn sẽ nhanh hơn nhiều so với thực hiện sắp xếp trong Ruby.

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