2011-10-06 10 views
5

C'è un modo per combinare gli ambiti nominati e gli sfingi? Non posso credere che non ci sia.c'è un modo per mescolare i binari chiamati scope e scope sphinx di pensiero?

Ho indice di sfinge su lezioni. Una volta che gli utenti acquistano le lezioni, hanno una schermata in cui possono visualizzare un elenco di tutte le loro lezioni. Voglio che eseguano le stesse ricerche che possono fare su lezioni a livello di sito, ma con l'ambito di quelle che possiedono.

Questo ovviamente non è possibile con gli ambiti di sola sfinge, perché non sto indicizzando i dati di acquisto, né penso che dovrei farlo.

C'è qualche modo per realizzare questo?

Questo è quello che ho finora per "combinare" i due sistemi. Sembra hackish a me, ma funziona:

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

risposta

3

È un po 'difficile dire se il vostro lavoro-around è opportuno, dato che non sono sicuro di quello che gli ambiti active_products_by_type e active_scope sono (che è quella Sfinge? Entrambi? Neanche?).

Ma non è possibile chiamare un ambito AR su una chiamata di ricerca, poiché gli ambiti AR sono costruiti sotto la copertura per generare query SQL. Sphinx ha il suo protocollo di interrogazione, ed è per questo che Thinking Sphinx ha aggiunto gli ambiti Sfinge. A questo si aggiunge che Sphinx non può fare riferimento al database durante la ricerca (solo durante l'indicizzazione), quindi qualsiasi riferimento ai dati che Sphinx non può vedere non sarà di aiuto.

Detto questo, probabilmente non c'è nulla nel codice che ti consenta di concatenare una chiamata di ricerca su un ambito AR - e probabilmente otterrai anche risultati - ma questo perché l'ambito influenza la chiamata Model.find che Thinking Sphinx rende per convertire i risultati della ricerca in istanze del modello. Il risultato è che mentre è possibile visualizzare oggetti, lo scope AR viene applicato solo alla pagina specificata dei risultati di ricerca e la matematica di impaginazione (numero di pagine/risultati totali) non sarà affidabile.

Urgh, che si trasformò in un po 'di un saggio, ma si spera che aiuta ...

+0

active_products_by_type è denominato scope e active_scope è TS scope – pixelearth

+0

Ok, allora il tuo work-around è probabilmente l'approccio migliore di allora. – pat

2

Credo che sia migliore per terminare con gli ambiti AR per essere in grado di fare .includes, .joins ecc:

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)