플러그인으로 데이터를 저장하는 가장 좋은 방법은 무엇인가요?

플러그인을 사용해 데이터를 저장할 계획인데, 저장할 값은 주제를 식별하는 ID 하나뿐입니다. 가장 좋은 방법은 무엇일까요?

감사합니다.

단일 Topic ID(예: 설정 가능한 값)만 저장해야 한다면, 가장 간단한 Discourse 네이티브 방법은 SiteSetting을 사용하는 것입니다.
이 경우 관리자 UI도 자동으로 제공됩니다.

config/settings.yml:

plugins:
  my_plugin_enabled:
    default: true
    client: false

  my_plugin_topic_id:
    default: 0
    client: false
    type: topic      # 관리자 UI에서 토픽 선택기를 제공합니다

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에서 읽은 내용을 떠올리게 했습니다.

방금 시작하려던 참이었는데, 이 문제를 지적해줘서 고마워. 값 하나를 위해 DB 테이블을 통째로 만드는 건 과하고 전혀 필요 없어. 혹시 아이디어가 있어?

사이트 설정을 원하지 않는 이유는 무엇인가요? 관리자도 볼 수 없도록 숨길 수 있습니다. 코어에 있는 특수 주제(예: TOS)의 ID와 비슷한 방식입니다.

저의 사용 사례는 다음과 같습니다. 플러그인이 활성화된 시점부터 생성된 모든 주제나 게시글은 다른 곳에 동기화되어 저장됩니다. 하지만 그 이전의 주제나 게시글은 동기화되지 않으므로, 이를 동기화하기 위해 작업을 실행해야 합니다. 아마도 100개씩 배치 단위로 처리할 것입니다. 다음 배치의 시작점을 알기 위해 가장 낮은 주제 ID를 저장해야 하며, 다음 배치는 그 값에서 100을 뺀 값부터 시작하는 식으로 진행됩니다.

Chatbot은 매우 유사한 작업을 수행합니다.

마이그레이션은 다음과 같습니다:

이것은 항상 레코드 하나가만 존재합니다 :slight_smile:

좋아요 - 적어도 나만 그런 게 아니군요 :laughing:… 다음 장벽은 마이그레이션을 어떻게 실행하느냐는 겁니다. 개발용 Discourse 사이트에서 하거나 다른 방법을 써야 할까요… 그러면 마이그레이션을 실행해도 Discourse의 마이그레이션 디렉토리에만 추가되는 건가요? 파일을 수동으로 복사해야 하나요? 감사합니다.

모든 플러그인 마이그레이션과 마찬가지로, 플러그인(위 Chatbot과 동일한 방식)에 배치합니다.

마이그레이션은 LOAD_PLUGINS=1 rake db:migrate 명령으로 실행합니다.

마이그레이션에 대한 자세한 내용은 다음 링크에서 확인하세요:

알아요. 제가 이해가 안 되는 건, 파일을 만들 때 분과 초를 수동으로 입력해야 한다는 거예요?

가이드를 읽어보세요. 1섹션 이후를 읽지 않은 것 같습니다. :wink:

PluginStore를 비추천(deprecate)해야 한다고 생각합니다. @david 님, 장기적으로 문제를 일으키기 때문입니다.

제 생각에는 새로운 테이블과 모델을 만드는 것이 최선의 방법입니다.

이러한 용도로는 게시글과 토픽의 커스텀 필드를 사용할 수 있습니다. 다만, 핵심 테이블에 인덱스를 추가하는 것이 적절하지 않아 보이기 때문에 인덱싱이 까다로울 수 있다는 단점이 있습니다. 결국 이는 새로운 테이블을 도입하는 문제로 돌아갑니다.