2011-10-06 1 views
5

명명 된 범위와 스핑크스 범위를 혼합하는 방법이 있습니까? 내가 믿을 수 없어.거기에 스코프라는 이름의 레일과 스핑크스 스코프를 혼합하는 방법이 있습니까?

레슨에 스핑크스 색인이 있습니다. 사용자가 수업을 구매하면 수업의 모든 목록을 볼 수있는 화면이 표시됩니다. 사이트 전반에 걸쳐 동일한 검색을 수행하기를 원하지만 자신이 소유 한 범위로 범위를 확대 해 보겠습니다.

스핑크스 전용 스코프에서는 구매 데이터에 대한 색인을 생성하지 않기 때문에 분명히 불가능합니다. 물론 그렇게해야한다고 생각하지 않습니다.

이 작업을 수행 할 수있는 방법이 있습니까?

이것은 내가 지금까지 두 시스템을 "결합"하는 것입니다. 그것은 나에게 hackish 보이지만 그것은 작동 :

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

답변

3

그것은 조금 나는 범위 active_products_by_typeactive_scope는 스핑크스의 하나가되는 것입니다 (무엇인지 확실하지 않다 주어, 당신의 주위에 일이 적절한 지 여부를 말할 어렵다? 둘 다? 둘 다?).

그러나 검색 범위에서 AR 범위를 호출 할 수는 없습니다. AR 범위는 SQL 쿼리를 생성하기 위해 내장되어 있기 때문입니다. 스핑크스는 독자적인 쿼리 프로토콜을 가지고 있습니다. 이것이 스핑크스가 스핑크스 범위를 추가 한 이유입니다. Sphinx가 검색 중에 데이터베이스를 참조 할 수 없기 때문에 (인덱싱 중에 만) 스핑크스에서 볼 수없는 데이터에 대한 참조는 도움이되지 않습니다.

검색 코드를 AR 스코프에 연결할 수있는 코드는 없습니다. 스코어가 생각 스핑크스가 만드는 전화 번호 Model.find에 영향을주기 때문에 결과가 다시 나타날 수도 있습니다. 검색 결과를 모델 인스턴스로 변환합니다. 결론은 객체를 볼 수있는 반면 AR 범위는 지정된 검색 페이지에만 적용되고 페이지 매기기 수학 (페이지 수/총 결과)은 신뢰할 수 없다는 것입니다. 에세이의 비트로 전환, 그러나 희망이 도움이

Urgh, ...

+0

active_products_by_type의 이름은 scope이며 active_scope는 TS scope입니다. – pixelearth

+0

좋아요, 그럼 해결 방법이 아마도 최선의 방법 일 것입니다. – pat

2

나는 그것이 .includes, .joins 등을 할 수 있도록 AR 범위로 끝나는 것이 좋습니다 같아요

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) 
관련 문제