プラグインとして、独自に定義したユーザーフィールドでユーザーを検索するフォームを作成しました。
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でユーザーを取得する必要があると思いますが、高速化する方法について提案があれば幸いです。