Consulta sobre como obter informações do usuário

Criei um formulário como um plugin que pesquisa um usuário a partir de um campo de usuário que defini independentemente.

Usei a Web API para armazenar informações do usuário em um banco de dados externo (AWS DynamoDB) e extrair dados dele para pesquisa.

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

O código acima obtém todos os usuários quando a página é aberta e os passa para o Angular.

Isso funciona bem, mas a resposta leva 3500 milissegundos, o que não é muito desejável. (cerca de 1400 usuários pesquisados).

Acho que o problema é que estou fazendo User.find(user_data[‘UserID’]) em um loop, mas não consigo pensar em uma maneira de melhorar isso.

Gostaria de exibir cartões de usuário, então acho que é necessário adquirir usuários no Ruby, mas ficaria feliz em receber sugestões sobre como torná-lo mais rápido.

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

Obrigado. Parece que será resolvido.

1 curtida

Então isso foi o suficiente? Você também poderia fazer algo como

user_ids=user_data.pluck(:UserID)
2 curtidas

Obrigado!
Eu não estava familiarizado com Ruby, então consegui isso com código sujo, mas vou tentar melhorá-lo da maneira que você está apresentando!

1 curtida