Qual a melhor forma de armazenar dados com um plugin?

Estou planejando armazenar dados com um plugin, de literalmente 1 valor, um ID de tópico. Qual é a melhor maneira de fazer isso?

Obrigado.

Se você só precisa armazenar um único ID de Tópico (como um valor configurável), a maneira mais simples nativa do Discourse é usando uma SiteSetting (Configuração do Site).
Você também obtém uma interface de administração integrada automaticamente.

config/settings.yml:

plugins:
  my_plugin_enabled:
    default: true
    client: false

  my_plugin_topic_id:
    default: 0
    client: false
    type: topic      # fornece um seletor de tópico na interface de administração

No seu código de plugin Ruby:

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

Se você preferir armazená-lo programaticamente (não exposto como uma configuração), o PluginStore também serve para um único par chave-valor:

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

topic_id = store.get("topic_id")
3 curtidas

Eu acho que o PluginStore é a maneira mais adequada. Uma configuração do site não se encaixará neste caso de uso. Obrigado!

1 curtida

Sua pergunta me lembrou de algo que li recentemente na Meta.

2 curtidas

Eu estava prestes a começar - obrigado por levantar isso. Parece que criar uma tabela de banco de dados inteira para 1 valor é exagero e completamente desnecessário. Alguma ideia?

1 curtida

Qual é o motivo pelo qual você não quer uma configuração de site? Ela poderia ser oculta para que os administradores não a vejam, de forma semelhante aos IDs para os tópicos especiais no núcleo, como o TOS.

Meu caso de uso é este: qualquer tópico ou postagem criada a partir do plugin ativado é sincronizada e armazenada em outro lugar. Mas os tópicos anteriores a isso não são, então preciso executar um trabalho para sincronizá-los, talvez em lotes de 100. Preciso armazenar o menor ID de tópico para que o próximo lote seja esse menos 100, e assim por diante.

O Chatbot faz algo muito semelhante.

Aqui está a migração:

3 curtidas

Isso é bom - pelo menos eu não sou o único :laughing:… meu próximo obstáculo é como executar a migração - em um site Discourse de desenvolvimento ou outra coisa… a execução da migração não adicionaria apenas ao diretório de migrações do Discourse? Devo copiar o arquivo manualmente? Obrigado.

Você o coloca, como em todas as migrações de plugins, no plugin (assim como o Chatbot acima).

Você executa as migrações com LOAD_PLUGINS=1 rake db:migrate

Leia sobre migrações aqui:

2 curtidas

A única coisa que não entendi é que devo escrever o minuto e o segundo manualmente ao criar o arquivo?

Leia o guia. Não estou convencido de que você leu além da seção 1. :wink:

1 curtida