# 关于如何获取用户信息

**URL:** <https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465>\
**Category:** Development\
**Created:** [2022年十月20日 10:34 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465 "2022-10-20T10:34:05Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Programer-D](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/programer-d/32/215194_2.png) [@Programer-D](https://meta.discourse.org/u/Programer-D)\
**Post date:** [2022年十月20日 10:34 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465/1 "2022-10-20T10:34:05Z")

</div>

我创建了一个插件表单，用于搜索我独立定义的某个用户字段中的用户。

我使用了 Web API 将用户信息存储在外部数据库（AWS DynamoDB）中，并从中提取数据进行搜索。

```ruby
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 中获取用户，但我很乐意获得关于如何使其更快的建议。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2022年十月20日 11:50 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465/2 "2022-10-20T11:50:52Z")

</div>

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

```

---

<div class="post-metadata">

**Author:** ![Programer-D](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/programer-d/32/215194_2.png) [@Programer-D](https://meta.discourse.org/u/Programer-D)\
**Post date:** [2022年十月20日 13:30 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465/3 "2022-10-20T13:30:35Z")

</div>

谢谢。看起来问题会得到解决。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2022年十月20日 14:14 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465/4 "2022-10-20T14:14:23Z")

</div>

那么这就够了？你也可以做类似的事情

```plaintext
user_ids=user_data.pluck(:UserID)

```

---

<div class="post-metadata">

**Author:** ![Programer-D](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/programer-d/32/215194_2.png) [@Programer-D](https://meta.discourse.org/u/Programer-D)\
**Post date:** [2022年十月21日 11:56 UTC](https://meta.discourse.org/t/consultation-on-how-to-obtain-user-information/242465/5 "2022-10-21T11:56:08Z")

</div>

> [@pfaffman](#):
>
> 所以这就够了？你也可以做类似的事情
> 
> ```plaintext
> user_ids=user_data.pluck(:UserID)
> 
> ```

谢谢！  
我之前不熟悉 Ruby，所以用了一些不太好的代码实现了，但我会尝试按照你展示的方式来改进它！
