Несколько моделей пагинаций в Каминари - PullRequest
22 голосов
/ 10 июня 2011

Я создаю поисковую страницу, которая будет выполнять поиск в приложениях пользователей, сообщений и комментариев.В настоящее время у меня есть:

# 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

Однако я действительно пытаюсь получить что-то, где все результаты смешаны, а затем разбиты на страницы.Каковы некоторые из стратегий для поиска по страницам, как это?Спасибо!

Ответы [ 3 ]

50 голосов
/ 17 июля 2011

С момента этой фиксации: https://github.com/amatsuda/kaminari/commit/f9f529fb68ab89feea38773a4c625c1b14859128

Вы можете сделать следующее

На ваш взгляд, вы можете сделать это:

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

и затем в вашем контроллеревы можете ссылаться на них следующим образом:

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

и js.erb вашего представления, у вас может быть что-то вроде:

$('#posts').html('<%= escape_javascript render(@posts) %>');
$('.table-pager').html('<%= escape_javascript(paginate(@posts, :remote => true).to_s) %>');
1 голос
/ 10 июня 2011

Прежде чем подумать о решении, вам необходимо сначала точно определить, каким вы хотите получить конечный результат. Если вы хотите отобразить несколько записей каждого типа на странице результатов, вы можете изменить опубликованный подход и объединить три разбитых на страницы результата, используя:

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

Каждый объект должен иметь метод экземпляра 'Score', который позволяет сортировать его по приоритету запроса. Кроме того, вам необходимо изменить вид, чтобы обеспечить правильную визуализацию каждого элемента и обеспечить вызов нумерации страниц в модели с наибольшим количеством страниц.

В качестве альтернативы, более надежным способом было бы добавить службу полнотекстового поиска (например, Индексная емкость , Web Solr , Thinking Sphinx ). Технология того, что актуально для этих движений, быстро внедряется, поэтому проведите некоторое исследование и найдите тот, который соответствует вашим потребностям. Пример синтаксиса для этого будет что-то вроде:

User.multi_solr_search query, models: [Post, Comment]
0 голосов
/ 10 июня 2011

Вы можете объединить результаты запроса и запустить страницу для этого.

users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])
...