Как искать пользователя по имени с пагинацией

У нас есть фронтенд-приложение, использующее Discourse в качестве ядра, и мы хотим реализовать поиск пользователей с пагинацией.

В настоящее время я не вижу, чтобы этот API (/search?q=name) поддерживал type_filter: user. Есть ли какие-то идеи, как это реализовать?

Вот наше решение:

  1. Откройте search_controller.rb и добавьте эту строку.
def show
    @search_term = params.permit(:q)[:q]

    // разрешить параметр type_filter из query-параметров
    @type_filter = params.permit(:type_filter)[:type_filter] || 'topic'

   ...
  1. Добавьте offset в search.rb.
  // это примерно на строке 780
  def user_search
    return if SiteSetting.hide_user_profiles_from_public && !@guardian.user

    users = User.includes(:user_search_data)
      .references(:user_search_data)
      .where(active: true)
      .where(staged: false)
      .where("user_search_data.search_data @@ #{ts_query("simple")}")
      .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END")
      .order("last_posted_at DESC")
      .offset(offset) // эта строка
      .limit(limit)

    users.each do |user|
      @results.add(user)
    end
  end

Теперь вы сможете искать пользователей по адресу /search?q=name&type_filter=user&page=1. По умолчанию возвращается 50 пользователей, а параметр page используется для получения дополнительных результатов.

Надеемся, это поможет! :grin:

3 лайка

Отличная идея! Мы тоже работаем с API Discourse, и при попытке использовать API поиска столкнулись с той же проблемой. Я могу помочь это исправить.

3 лайка