Вопрос

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

# 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])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top