Consultation sur la manière d'obtenir des informations sur les utilisateurs

J’ai créé un formulaire sous forme de plugin qui recherche un utilisateur à partir d’un champ utilisateur que j’ai défini indépendamment.

J’ai utilisé l’API Web pour stocker les informations utilisateur dans une base de données externe (AWS DynamoDB) et en extraire des données pour la recherche.

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

Le code ci-dessus récupère tous les utilisateurs lorsque la page est ouverte et les transmet à Angular.

Cela fonctionne bien, mais la réponse prend 3500 millisecondes, ce qui n’est pas très souhaitable. (environ 1400 utilisateurs recherchés).

Je pense que le problème est que j’utilise User.find(user_data['UserID']) dans une boucle, mais je ne trouve pas de moyen de l’améliorer.

Je voudrais afficher des cartes d’utilisateur, donc je pense qu’il est nécessaire d’acquérir les utilisateurs sur Ruby, mais je serais heureux d’obtenir des suggestions sur la façon de le rendre plus rapide.

User.find_by_sql("select * from users where id in (#{user_ids.join(',')})")
1 « J'aime »

Merci. Il semble que cela sera résolu.

1 « J'aime »

Alors c’était suffisant ? Vous pourriez aussi faire quelque chose comme

user_ids=user_data.pluck(:UserID)
2 « J'aime »

Merci !
Je ne connaissais pas Ruby, j’ai donc réussi avec du code sale, mais j’essaierai de l’améliorer comme vous le présentez !

1 « J'aime »