ユーザー情報の取得方法に関するご相談

プラグインとして、独自に定義したユーザーフィールドでユーザーを検索するフォームを作成しました。

Web APIを使用して、外部DB(AWS DynamoDB)にユーザー情報を保存し、そこからデータを抽出して検索できるようにしました。

class DiscourseUserSearchController < ApplicationController
  def index
  end

  def search
    dynamodb = Aws::DynamoDB::Client.new(
      access_key_id: ENV['ACCESS_KEY_ID'],
      secret_access_key: ENV['SECRET_ACCESS_KEY'],
      region: AWS_REGION
    )

    scan_condition = {
      table_name: "DiscourseUserInformation"
    }
    result = dynamodb.scan(scan_condition)

    result = result.items
    Rails.logger.info result
    data = result.map do |user_data|
      user = User.find(user_data['UserID'])
      user_data['avatar_template'] = user.avatar_template
      user_data['username'] = user.username
      next user_data

    end

    render status: 200, json: { status: 200, data: data }
  end
end

上記のコードは、ページが開かれたときにすべてのユーザーを取得し、Angularに渡します。

これは問題なく動作しますが、応答に3500ミリ秒かかり、これは望ましくありません。(約1400人のユーザーを検索しています)。

ループ内でUser.find(user_data['UserID'])を実行していることが問題だと思いますが、改善する方法が思いつきません。

ユーザーカードを表示したいので、Rubyでユーザーを取得する必要があると思いますが、高速化する方法について提案があれば幸いです。

 User.find_by_sql("select * from users where id in (#{user_ids.join(',')})")
「いいね!」 1

ありがとうございます。解決しそうです。

「いいね!」 1

それで十分だったということですか?以下のようなこともできます。

user_ids=user_data.pluck(:UserID)
「いいね!」 2

ありがとうございます!
Rubyに慣れていなかったので、汚いコードで対応してしまいましたが、ご提示いただいた方法で改善してみます!

「いいね!」 1