مشاورة حول كيفية الحصول على معلومات المستخدم

لقد قمت بإنشاء نموذج كمكون إضافي يبحث عن مستخدم من حقل مستخدم قمت بتعريفه بشكل مستقل.

لقد استخدمت Web API لتخزين معلومات المستخدم في قاعدة بيانات خارجية (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)

شكرًا لك!
لم أكن على دراية بلغة روبي، لذا أنجزت ذلك بكود غير نظيف، لكنني سأحاول تحسينه بالطريقة التي تقدمها!

إعجاب واحد (1)