2011-10-06 7 views
5

¿Hay alguna manera de mezclar alcances con nombre y alcances de esfinges? No puedo creer que no.¿hay alguna manera de mezclar los raíles con nombre de alcances y los alcances de las esfinges pensantes?

Tengo índice esfinge en Lecciones. Una vez que los usuarios compran lecciones, tienen una pantalla en la que pueden ver una lista de todas sus lecciones. Quiero que realicen las mismas búsquedas que pueden en las lecciones de todo el sitio, pero con el alcance de las que poseen.

Esto, obviamente, no es posible con los alcances exclusivos de esfinge, porque no estoy indexando los datos de compras, ni creo que deba hacerlo.

¿Hay alguna manera de lograr esto?

Esto es lo que tengo hasta ahora para "combinar" los dos sistemas. Parece hacker para mí, pero funciona:

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

Respuesta

3

Es un poco difícil saber si su trabajo en todo es apropiada, dado que no estoy seguro de lo que los alcances active_products_by_type y active_scope son (que es la Esfinge? ¿Ambos ninguno?).

Pero no puede llamar a un ámbito de AR en una llamada de búsqueda, porque los ámbitos AR se crean bajo el capó para generar consultas SQL. Sphinx tiene su propio protocolo de consulta, por lo que Thinking Sphinx agregó los telescopios Sphinx. Además, Sphinx no puede hacer referencia a la base de datos durante la búsqueda (solo durante la indexación), por lo que cualquier referencia a datos que Sphinx no pueda ver tampoco será útil.

Dicho todo esto, probablemente no haya nada en el código que le permita encadenar una búsqueda en un alcance AR, e incluso obtendrá resultados, pero esto se debe a que el alcance afecta la llamada Model.find que hace Thinking Sphinx para convertir resultados de búsqueda en instancias modelo. El resultado es que, aunque puede ver objetos, el alcance de AR solo se aplica a la página dada de los resultados de búsqueda, y la matemática de paginación (número de páginas/resultados totales) no será confiable.

Urgh, que se convirtió en un poco de un ensayo, pero es de esperar que ayuda ...

+0

active_products_by_type se denomina scope, y active_scope es TS scope – pixelearth

+0

Bien, entonces su solución alternativa es probablemente el mejor enfoque en ese momento. – pat

2

supongo que es mejor acabar con ámbitos AR a ser capaz de hacer · Incluye, etc .joins:

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) 
Cuestiones relacionadas