Domanda

Sto creando una pagina di ricerca che farà un'applicazione ampia cercare gli utenti, i post e commenti. Al momento ho:

# 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

Comunque sto cercando di ottenere qualcosa in cui tutti i risultati sono mescolati insieme poi paginate. Quali sono alcune delle strategie per fare ricerca impaginato come questo? Grazie!

È stato utile?

Soluzione

Prima di pensare a una soluzione, è necessario definire prima esattamente ciò che si desidera che il risultato finale di essere. Se si desidera visualizzare un paio di ogni tipo di record nella pagina dei risultati è possibile modificare l'approccio che avete inviato e combinare i tre risultati impaginato utilizzando:

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

Ogni oggetto avrà bisogno di avere 'punteggio' un metodo di istanza che lasciarlo sorta basa sulla priorità query. Inoltre, sarà necessario modificare l'immagine per gestire correttamente il rendering di ogni elemento e garantire che l'impaginazione è chiamato il modello con il maggior numero di pagine.

In alternativa, un metodo più robusto potrebbe essere quella di aggiungere un servizio di ricerca full-text (come Indice Tank, < a href = "http://websolr.com/" rel = "nofollow"> Web Solr , Thinking Sphinx ). La tecnologia per ciò che è caldo per questi si muove rapidamente, in modo da fare qualche ricerca e trovare uno che si adatta alle tue esigenze. Sintassi esempio di questo sarebbe qualcosa di simile:

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

Altri suggerimenti

Da quando questo commit: https://github.com/amatsuda/kaminari/commit/f9f529fb68ab89feea38773a4c625c1b14859128

È possibile effettuare le seguenti

Secondo voi si può fare questo:

<%= 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" %>

e poi nel vostro controller che si può fare riferimento a loro in questo modo:

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

e js.erb della vostra vista si potrebbe avere qualcosa di simile:

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

È possibile combinare i risultati della pagina di ricerca ed eseguire su questo.

users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top