Pregunta

Estoy creando una página de búsqueda que hará una búsqueda en toda la aplicación en usuarios, publicaciones y comentarios. Actualmente tengo:

# POST /search
def index
  query = params[:query]
  @users = User.search(query).page(params[:page])
  @posts = Post.search(query).page(params[:page])
  @comments = Comment.search(query).page(params[:page])

  respond_to do |format|
    format.html
  end
end

Sin embargo, realmente estoy tratando de obtener algo donde todos los resultados se mezclen y luego se paginen. ¿Cuáles son algunas de las estrategias para hacer una búsqueda paginada como esta? ¡Gracias!

¿Fue útil?

Solución

Antes de pensar en una solución, primero debe definir exactamente lo que desea que sea el resultado final. Si desea mostrar algunos de cada tipo de registro en la página de resultados, puede modificar el enfoque que publicó y combinar los tres resultados paginados usando:

@results = @users + @posts + @comments
@results.sort! { |a, b| a.score(query) > b.score(query) }

Cada objeto deberá tener un método de instancia 'puntaje' que lo permita ordenar en función de la prioridad de consulta. Además, deberá modificar su vista para manejar la representación correcta de cada elemento y asegurarse de que la paginación se llame al modelo con la mayoría de las páginas.

Alternativamente, un método más robusto sería agregar un servicio de búsqueda de texto completo (como Tanque índice, Solr web, Pensando esfinx). La tecnología para lo que está de moda para estos se mueve rápidamente, así que investigue un poco y encuentre una que se adapte a sus necesidades. La sintaxis de ejemplo para esto sería algo como:

User.multi_solr_search query, models: [Post, Comment]

Otros consejos

Desde este cometer: https://github.com/amatsuda/kaminari/commit/f9f529fb68ab89feea38773a4c625c1b14859128

Puedes hacer lo siguiente

En su opinión, puede hacer esto:

<%= paginate @users, :remote => true, :param_name => "user_page" %>
<%= paginate @posts, :remote => true, :param_name => "post_page" %>
<%= paginate @comments, :remote => true, :param_name => "comment_#{some_post_id}_page" %>

Y luego, en su controlador, puede referirse a ellos de esta manera:

@users = User.search(query).page(params[:user_page])
@posts = Post.search(query).page(params[:post_page])
@comments = Comment.search(query).page(params[:comment_page])

Y su vista es js.erb, es posible que tenga algo como:

$('#posts').html('<%= escape_javascript render(@posts) %>');
$('.table-pager').html('<%= escape_javascript(paginate(@posts, :remote => true).to_s) %>');

Puede combinar los resultados de la consulta y ejecutar la página en eso.

users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top