Лиц несколько моделей в Каминари
-
26-10-2019 - |
Вопрос
Я создаю страницу поиска, которая будет выполнять широкий поиск приложения для пользователей, сообщений и комментариев. У меня сейчас есть:
# 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
Однако я действительно пытаюсь получить что -то, где все результаты смешиваются вместе, а затем на страже. Каковы некоторые стратегии для выполнения такого поиска в таком виде на странице? Спасибо!
Решение
Прежде чем думать о решении, вам нужно сначала определить, какой именно вы хотите, чтобы конечный результат был. Если вы хотите отобразить несколько типов записей на странице результатов, вы можете изменить отправленный вами подход, и объединить три лицензионных результата, используя:
@results = @users + @posts + @comments
@results.sort! { |a, b| a.score(query) > b.score(query) }
Каждый объект должен будет иметь метод экземпляра «оценка», который позволит ему сортировать на основе приоритета запроса. Кроме того, вам нужно будет изменить свое представление, чтобы обработать правильный рендеринг каждого элемента и убедиться, что страница вызывает на модели с наибольшим количеством страниц.
В качестве альтернативы, более надежным методом будет добавление полнотекстовой службы поиска (например, как Индексный бак, Веб, Думая Сфинкс) Технология того, что жарко для этих движений быстро, проводят некоторые исследования и найдите то, что соответствует вашим потребностям. Пример синтаксиса для этого будет чем -то вроде:
User.multi_solr_search query, models: [Post, Comment]
Другие советы
С тех пор, как этот коммит: 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) %>');
Вы можете объединить результаты из страницы запроса и запустить это.
users = User.search(query)
posts = Post.search(query)
comments = Comment.search(query)
@results = users + posts + comments
@results.page(params[:page])