will_paginate rails per page ruby-on-rails ruby search pagination kaminari

ruby-on-rails - rails will_paginate per page



Paginar mĂșltiples modelos en Kaminari (3)

Estoy creando una página de búsqueda que hará una búsqueda amplia de 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 mezclan y luego se paginan. ¿Cuáles son algunas de las estrategias para hacer una búsqueda paginada como esta? ¡Gracias!


Antes de pensar en una solución, primero debe definir exactamente cuál 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 utilizando:

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

Cada objeto deberá tener un método de instancia ''puntuación'' que le permitirá clasificar de acuerdo con la prioridad de la consulta. Además, deberá modificar su vista para manejar la representación correcta de cada elemento y asegurarse de que se llame a la paginación en el modelo con la mayor cantidad de páginas.

Alternativamente, un método más robusto sería agregar un servicio de búsqueda de texto completo (como Index Tank , Web Solr , Thinking Sphinx ). La tecnología para lo que está de moda se mueve rápidamente, así que investigue y encuentre una que se ajuste a sus necesidades. Ejemplo de sintaxis para esto sería algo como:

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


Desde este compromiso: 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 js.erb de su vista puede tener algo como:

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


Podrías 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])