Какой лучший способ хранить данные с помощью плагина?

Я планирую хранить данные с помощью плагина — буквально одно значение: идентификатор темы. Какой способ лучше всего подходит для этого?

Спасибо.

Если вам нужно хранить только один ID темы (например, как настраиваемое значение), самый простой нативный для Discourse способ — использовать SiteSetting.
Вы также автоматически получаете встроенный интерфейс администратора.

config/settings.yml:

plugins:
  my_plugin_enabled:
    default: true
    client: false

  my_plugin_topic_id:
    default: 0
    client: false
    type: topic      # предоставляет селектор тем в интерфейсе администратора

В вашем Ruby-коде плагина:

topic_id = SiteSetting.my_plugin_topic_id
topic = Topic.find_by(id: topic_id)

Если вы предпочитаете хранить это программно (не как настройку),
PluginStore также подходит для одной пары ключ-значение:

store = PluginStore.new("my_plugin")
store.set("topic_id", some_topic_id)

topic_id = store.get("topic_id")

Я думаю, что PluginStore — это наиболее подходящий вариант. Настройка сайта не подойдет для этого случая. Спасибо!

Ваш вопрос напомнил мне о том, что я недавно прочитал на Meta.

Я как раз собирался начать — спасибо, что подняли этот вопрос. Похоже, создавать целую таблицу базы данных для одного значения — это излишне и совершенно не нужно. Есть какие-нибудь идеи?

Почему вы не хотите, чтобы настройка сайта отображалась? Она может быть скрыта, чтобы администраторы её не видели, примерно так же, как идентификаторы специальных тем в ядре, например TOS.

Мой сценарий использования таков: любые темы или сообщения, созданные с момента включения плагина, синхронизируются и сохраняются в другом месте. Однако темы, созданные до этого момента, не синхронизируются автоматически, поэтому мне нужно запустить задачу для их синхронизации, возможно, партиями по 100. Мне необходимо хранить идентификатор самой нижней темы, чтобы следующая партия начиналась с неё минус 100, и так далее.

Chatbot делает что-то очень похожее.

Вот миграция:

В ней всегда содержится только одна запись :slight_smile:

Это хорошо — по крайней мере, я не единственный :laughing:… моё следующее препятствие — как запустить миграцию: на тестовом сайте Discourse или где-то ещё… не приведёт ли запуск миграции просто к добавлению файла в директорию миграций Discourse? Мне стоит скопировать файл вручную? Спасибо.

Разместите его, как и при всех миграциях плагинов, в плагине (точно так же, как и Chatbot выше).

Запустите миграции командой LOAD_PLUGINS=1 rake db:migrate

Узнайте больше о миграциях здесь:

Я понимаю, но я не совсем понимаю, что мне нужно вручную прописывать минуты и секунды при создании файла?

Прочитайте руководство. Не убеждены, что вы читали его дальше раздела 1. :wink:

По-видимому, нам стоит отказаться от использования PluginStore, @david, это приведёт к проблемам в будущем.

На мой взгляд, правильным решением будет создание новых таблиц и моделей.

Для этого можно использовать пользовательские поля сообщений и тем. Однако недостаток в том, что индексация может оказаться сложной, поскольку добавлять индексы к основным таблицам кажется неправильным. Это возвращает нас к идее создания новых таблиц.