2011-10-06 6 views
5

名前付きスコープとスフィンクススコープを混在させる方法はありますか?そこにはないと私は信じられない。は、スコープと考えているスフィンクススコープを混在させる方法がありますか?

私はレッスンにスフィンクスインデックスを持っています。ユーザーがレッスンを購入すると、すべてのレッスンのリストが表示される画面が表示されます。サイト全体のレッスンでも同じ検索を実行したいが、自分が所有しているレッスンで検索することができます。

私は購入データのインデックスを作成していないので、これは明らかにスフィンクス専用のスコープでは不可能です。

これを行う方法はありますか?

これは、これまで2つのシステムを「結合」するためのものです。それは私にはハックようだが、それは動作します:

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スコープはSQLクエリを生成するために構築されているため、検索呼び出しでARスコープを呼び出すことはできません。スフィンクスには独自のクエリープロトコルがあります。そのため、Thinking SphinxはSphinxスコープを追加しました。これは、Sphinxが検索中にデータベースを参照することができないこと(索引付け中のみ)だから、Sphinxが見ることのできないデータへの参照は役に立ちません。

すべてのことは、検索範囲をARスコープにすることはできないだろうと思っていましたが、スコープがThinking Sphinxの呼び出しに影響を与えるためです。検索結果をモデルインスタンスに変換します。その結果、オブジェクトを見ることができる一方で、ARスコープは検索結果の特定のページにのみ適用され、ページネーション数(ページ数/合計結果)は信頼できません。エッセイのビットになって、うまくいけば、それは助け

Urgh、...

+0

active_products_by_typeは名前付きスコープで、active_scopeはTSスコープです – 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) 
関連する問題