# 如何从数据库为您的主题组件拉取数据？

**URL:** https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995
**Category:** Development
**Created:** [2020年三月12日 05:00 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995 "2020-03-12T05:00:14Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [2020年三月12日 05:00 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/1 "2020-03-12T05:00:14Z")

</div>

请问有人知道是否有相关的指南或示例吗？

比如说，如果我使用主题组件创建一个侧边栏，如何在该侧边栏或主题组件中列出最新的 20 个公开可见的主题（或者如果更容易的话，从我在查询中列出的分类中获取）？

---

<div class="post-metadata">

### Author: ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)
#### Post date: [2020年三月12日 11:38 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/2 "2020-03-12T11:38:46Z")

</div>

有几种方法可以实现这一点。最简单的方法是使用 AJAX 调用 Rails API 中提供所需数据的端点。如果您想获取最新的 20 个主题，可以尝试访问 `/latest.json`。

挑战在于，如果您需要整合来自多个端点的信息，就必须等待多个调用全部完成，这可能会显著降低主题组件的性能。

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [2020年三月12日 17:54 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/3 "2020-03-12T17:54:51Z")

</div>

谢谢你的回复，Justin 🙂

有没有简单的方法可以直接复用 Discourse 已经提供的订阅源/数据？（这样也能尊重用户的设置。）

例如，在侧边栏中我们可能会显示：

- 最新 10 个主题（来自“最新”页面的订阅源，但也会忽略已静音的分类）
- 本周热门主题（来自 /top）
- 本月热门主题
- 本年热门主题
- 本月最活跃用户（来自 /u?period=monthly）

在其他论坛平台上这其实很容易实现，但在 Discourse 上却很难做到，我真的很怀念这个功能 😭

---

<div class="post-metadata">

### Author: ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)
#### Post date: [2020年三月12日 18:00 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/4 "2020-03-12T18:00:28Z")

</div>

完全正确。通过 Ajax 请求相关端点时，会尊重用户的当前设置。

访问 `/latest.json` 仅会显示该特定用户可见的最新主题。

尝试从相同路径发起 GET 请求，并在 URL 末尾添加 `.json`，看看会发现什么！

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [2020年三月12日 18:08 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/5 "2020-03-12T18:08:12Z")

</div>

您认为这与直接用那些端点执行的查询访问数据库的效果大致相同吗？（或者，由于这相当于需要加载 5 个额外页面——每个端点一个——它是否会消耗显著更多的资源？）

无论如何，我都很想尝试一下这个方案。是否有指南或教程展示如何从端点获取数据并传入主题组件？（或者，开发一个插件是否更好或更高效？）

_我知道如何创建主题组件和一个“虚拟”插件，但尚未找到任何展示如何从数据库获取数据并传入它们的指南。_

---

<div class="post-metadata">

### Author: ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)
#### Post date: [2020年三月12日 18:11 UTC](https://meta.discourse.org/t/how-do-you-pull-in-data-from-the-db-for-your-theme-components/143995/6 "2020-03-12T18:11:25Z")

</div>

[https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949](https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949)

本指南展示了如何使用特定标签实现此功能，但实际上您可以将这种方法复制到其他任何端点。
