2011-10-06 25 views
5

Có cách nào để trộn các phạm vi và phạm vi nhân sư có tên không? Tôi không thể tin là không có.có cách nào để trộn các đường ray có tên là phạm vi và phạm vi nhân sư suy nghĩ không?

Tôi có chỉ mục nhân sư về Bài học. Sau khi người dùng mua bài học, họ có màn hình để họ có thể xem danh sách tất cả các bài học của họ. Tôi muốn họ thực hiện các tìm kiếm tương tự mà họ có thể thực hiện trên các bài học trên toàn trang web, nhưng phạm vi cho những bài học mà họ sở hữu.

Điều này rõ ràng là không thể với phạm vi chỉ có nhân sư, bởi vì tôi không lập chỉ mục dữ liệu mua hàng, cũng như tôi nghĩ tôi không cần phải làm như vậy.

Có cách nào để thực hiện việc này không?

Đây là những gì tôi có cho đến nay để "kết hợp" hai hệ thống. Có vẻ như hackish với tôi nhưng nó hoạt động:

lesson_ids = current_user.active_products_by_type(:lessons).collect{|x| x.id} 
@lessons = Lesson.active_scope.search :with => {:id => lesson_ids } 

Trả lời

3

Đó là một chút khó khăn để nói cho dù công việc xung quanh bạn là thích hợp, vì tôi không chắc chắn những gì phạm vi active_products_by_typeactive_scope là (đó là một Sphinx? Cả hai? Không?).

Nhưng bạn không thể gọi phạm vi AR trên cuộc gọi tìm kiếm, vì phạm vi AR được tạo bên dưới nắp để tạo truy vấn SQL. Sphinx có giao thức truy vấn riêng của nó, đó là lý do tại sao Think Sphinx thêm phạm vi Sphinx. Thêm vào đó là Sphinx không thể tham khảo cơ sở dữ liệu trong khi tìm kiếm (chỉ trong khi lập chỉ mục), vì vậy bất kỳ tham chiếu đến dữ liệu mà Sphinx không thể nhìn thấy cũng sẽ không hữu ích. Tất cả những gì đã nói, có thể không có gì trong mã sẽ cho phép bạn chuỗi cuộc gọi tìm kiếm trên phạm vi AR - và thậm chí bạn sẽ nhận được kết quả - nhưng điều này là do phạm vi ảnh hưởng đến cuộc gọi Model.find mà Thinking Sphinx để chuyển đổi kết quả tìm kiếm thành các phiên bản mẫu. Kết quả là trong khi bạn có thể thấy các đối tượng, phạm vi AR chỉ được áp dụng cho trang kết quả tìm kiếm đã cho và phép tính số trang (số trang/tổng số kết quả) sẽ không đáng tin cậy.

Urgh, mà biến thành một chút của một bài tiểu luận, nhưng hy vọng nó sẽ giúp ...

+0

active_products_by_type là phạm vi được đặt tên và active_scope là phạm vi TS – pixelearth

+0

Được rồi, khi đó công việc của bạn có lẽ là phương pháp tốt nhất sau đó. – pat

2

Tôi đoán nó tốt hơn để kết thúc với phạm vi AR để có thể làm .includes, .joins vv:

sphinx_scope(:visible) do 
    { with: {is_visible: true} } 
end 

@items = Item.where(
    id: Item.visible.search_for_ids(nil, 
    page: params[:page], 
    with: { 
     tag_id: @tag.id, 
     category_id: current_category.id 
    } 
) 
).order(:id).includes(:photos) 
Các vấn đề liên quan