2012-01-02 24 views
5

Tôi muốn biết cách đặt hàng hiệu quả trong Rails. Chúng ta đều biết rằng bạn có thể đặt hàng đơn giản trong Rails với các phương pháp sau:Thứ tự tùy chỉnh, hiệu quả, phức tạp trong Rails 3

Model.order("created_at ASC").limit(10) 

Trong trường hợp này, tôi chỉ cần kéo 10 mục đầu tiên. Nếu tôi muốn thêm một thứ tự không được mô tả theo thời gian, tôi có thể tạo một cột trong Model (ví dụ cột custom_ordering) và các giá trị đầu vào để sắp xếp các đối tượng. Trường hợp đó, bạn chỉ cần sửa đổi lệnh gọi ("custom_ordering ASC").

NHƯNG giả sử tôi muốn đặt hàng dựa trên tùy chọn được dự đoán của người dùng. Trong trường hợp này, không thể tạo cột mới vì mỗi người dùng có sở thích khác nhau. Điều gì sẽ là một cách thông minh, hiệu quả để hoàn thành nhiệm vụ này?

Một phương pháp sẽ là tạo một thuật toán để dự đoán đánh giá của người dùng đối tượng từ Mô hình được gọi là model_rating (đối tượng). Thuật toán này sẽ tạo ra một giá trị số nguyên dương của xếp hạng của chúng. Nếu tôi đi xuống con đường này, làm thế nào tôi có thể đặt hàng hiệu quả Mô hình?

Một phương pháp khác là đặt thuật toán thành người dùng model_entry.user_preference (người dùng). Sau đó, tôi có thể đặt hàng theo:

Model.all.sort! { |b, a| a.user_preference(user) <=> b.user_preference(user) } 

Nhưng điều này đánh tôi là không hiệu quả. Nó phải gọi tất cả các mục trong mô hình và sau đó sắp xếp chúng, ngay cả khi bạn sử dụng các phương pháp phân loại hiệu quả như sắp xếp hợp nhất hoặc bong bóng, có hiệu suất kém trên các mô hình có số lượng lớn mục nhập.

Có các đường dẫn khác mà tôi không xem xét không? Có ai có thể chỉ cho tôi đi đúng hướng không?

Trả lời

0

Trong giải pháp này, tôi giả định rằng việc tính toán thứ tự ưa thích của người dùng là tốn kém và tập hợp bạn đang đặt hàng không cập nhật thường xuyên.

Điều bạn có thể làm là tính toán thứ tự thường xuyên (trong tác vụ nền) và lưu trữ thứ tự được tính toán trong một bảng riêng biệt cho mỗi người dùng.

Ngoài ra, nếu bạn không có nhiều người dùng, bạn có thể lưu trong một bảng riêng biệt điểm số của mỗi mô hình cho mỗi người dùng và sắp xếp theo giá trị đó trong một lần tham gia. Các giá trị này sau đó có thể được tính toán lại một cách thường xuyên.

+0

có, những tùy chọn này có vẻ khả thi. Bạn có nghĩ rằng một trong những cách tiếp cận này sẽ là một trang web lớn như facebook đặt hàng một nguồn cấp tin tức không? Trong những trường hợp này, bạn có cả nhiều mục nhập bảng và nhiều người dùng. – jay

+0

Trong trường hợp của Facebook, tôi nghĩ rằng họ lưu trữ một nguồn cấp tin tức riêng biệt cho mỗi người. Tôi không tin rằng "những câu chuyện" được chia sẻ giữa mọi người. Những câu chuyện này đang sử dụng tài nguyên được chia sẻ (Album, nhận xét, v.v ...)) nhưng mỗi câu chuyện trên dòng thời gian của bạn được xây dựng cho bạn. (Ít nhất, đó là cách tôi sẽ xây dựng nó) –

+0

tốt, rất thú vị! luôn luôn khai sáng để thảo luận về công cụ này với những người khác! cảm ơn rất nhiều cho đầu vào của bạn – jay

0

Sắp xếp bong bóng không hiệu quả.

Nếu bạn đang nói về sắp xếp một mô hình, thì đúng là tất cả đầu vào sắp xếp sẽ là thuộc tính của mô hình đó. Nếu mỗi người dùng có thể chỉ định tùy chọn sắp xếp của riêng họ, thì tùy chọn đó đi xuống thuộc tính hoặc danh sách thuộc tính. Lưu danh sách đó làm tùy chọn người dùng, sau đó tự động tạo truy vấn. Heck, lưu mã thực tế như sở thích và làm một eval trên nó.

Nhưng, ngay cả SQL hiệu quả cũng bị phá vỡ khi số lượng bản ghi tiếp cận ngưỡng. Trong trường hợp đó, bạn cần một công cụ mới.

Bạn có thể sử dụng triển khai tìm kiếm phù hợp, vốn đã bao gồm sắp xếp. Tôi sử dụng Solr với đá quý Sunspot. Và có vẻ như Nhân sư với viên đá quý-tư duy cũng có lực kéo tốt.

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