存储插件数据有什么最佳方式?

我计划使用插件存储数据,该数据只有一个值,即主题 ID。实现此目的的最佳方法是什么?

谢谢。

如果您只需要存储单个主题 ID(如可配置值),最简单的 Discourse 原生方法是使用 SiteSetting
您还会自动获得一个内置的管理员界面。

config/settings.yml
``yml
plugins:
my_plugin_enabled:
default: true
client: false

my_plugin_topic_id:
default: 0
client: false
type: topic # 在管理员界面中为您提供一个主题选择器
``

在您的 Ruby 插件代码中:
rb topic_id = SiteSetting.my_plugin_topic_id topic = Topic.find_by(id: topic_id)

如果您更喜欢以编程方式存储它(不作为设置公开),
PluginStore 对于单个键值对也是可以的:

``rb
store = PluginStore.new(“my_plugin”)
store.set(“topic_id”, some_topic_id)

topic_id = store.get(“topic_id”)
``

3 个赞

我认为 PluginStore 是最合适的方式。站点设置不适合此用例。谢谢!

1 个赞

您的提问让我想起了我最近在 Meta 上读到的内容。

2 个赞

我正准备开始——感谢您提出这个问题。似乎为一个值创建一个完整的数据库表是矫枉过正的,而且完全没有必要。有什么想法吗?

1 个赞

你不希望设置站点设置的原因是什么?它可以被隐藏,这样管理员就看不到它了,就像核心中特殊主题的 ID 一样,例如 TOS(服务条款)。

我的用例是:从插件创建的任何主题或帖子都已启用同步并存储在别处。但在此之前的帖子则没有,所以我必须运行一个作业来同步它们,也许是分批(每次 100 个)进行。我需要存储最低的主题 ID,这样下一个批次就是该 ID 减去 100,依此类推。

聊天机器人做的事情非常相似。

这是迁移:

3 个赞

那太好了——至少我不是唯一一个 :laughing:… 我的下一个难点是如何运行迁移——是在一个开发中的 Discourse 站点还是其他地方……运行迁移后不会只是添加到 Discourse 的迁移目录中吗?我应该手动复制文件吗?谢谢。

您需要像所有插件迁移一样,将其放置在插件中(就像上面的聊天机器人一样)。

使用 LOAD_PLUGINS=1 rake db:migrate 运行迁移。

在此处阅读有关迁移的更多信息:

2 个赞

我唯一不明白的是,我创建文件时需要手动输入分钟和秒吗?

阅读指南。不相信你已经读完了第一部分之后的内容。:wink:

1 个赞