ユーザーとタグの関係を作成するプラグイン

こんにちは。現在特定のプラグインに取り組んでいますが、まだどこから手をつければよいかわかりません(ここにある入門資料を読み、いくつかの簡単なプラグインをインストールして、そのソースを少しいじってみました)。

セットアップ: システムの複数のユーザー名と、それらが関連付けられているタグを含むCSVファイルがあります。たとえば、「user1, tag#1」というエントリは、「user1はtag#1について知っている」と読み取れます。多くのユーザーが1つのタグに関連付けられ、1人のユーザーが多くのタグに関連付けられる可能性があります。さらに、このCSVは時々(ほぼ毎日1回)更新されます。ファイルは、Discourseインスタンスをホストしているのと同じサーバーにあります。

プラグインの理想的な動作: CSVファイルと画像を使用してこれを説明します。

CSV:

userOP, tag#1
userOP, tag#2
user2, tag#1

このCSVを考慮すると、CSVに含まれるタグのいずれかを持つトピックが作成されると(トピックの著者はリストにない場合があります)、理想的な出力は次のようになります。

さらに、ユーザーは「Known Tags」という追加のタブを持つユーザーパネルで、既知のタグを clickable links として見ることができます。

理想的には、このタブには左上のメニューからすばやくアクセスできる必要があります。

つまり、CSVで定義された関係に基づいて、CSVのタグに関連付けられているユーザー(OPまたはその他)がトピックの下に投稿した場合、そのユーザーの小さなテキストまたはバッジが表示される必要があります。

これを達成する方法について、ご提案をお待ちしております。

レール側で、フロントエンドで利用できるように、そのデータをシリアライザーにユーザー/タグリレーションを追加する必要があります。他のプラグインで add_to_serializer を呼び出しているものを探すか、ディスコースソースで検索してください。そこにはよく文書化されています。

その後、それをページに追加するために、エンバーでプラグインのアウトレットを使用できるようになります。テーマコンポーネントのドキュメントにその例があります。

CSVファイルを使用するのではなく、カスタムユーザーフィールドを管理するためのルートを追加するかもしれませんが、CSVの方法で行きたい場合は、1時間ごとに読み取るジョブなどが必要になる可能性があるため、jobs/scheduled に何かがあるプラグインを見つけてください。

all_the_plugins というディスコースリポジトリがあり、そこで何か例を探すためにgrepすることがあります。github.com/discourse を見ていくと、それを見つけることができるはずです。

情報ありがとうございます。現時点での私のメンタルモデルは、タグに attached_users というカスタムフィールド(tag_description のようなもの)を追加すべきだということです。上記の例では、タグ#1 には attached_users: ["userOP", "user1"] を設定する必要があります。

その後、これをシリアライザーに追加し、投稿に表示する方法を見つける必要があります。

これを考えているうちに、別のアイデアが浮かびました。タグに基づいてこれらのユーザーをトピックに割り当てるために Discourse Assign (Discourse Assign) を使用した場合、トピックからこの情報を取得でき、表示も簡単になると思います。しかし、Discourse Assign には、プログラムでユーザーを追加する方法が提供されていません。

assign を使うのは良い考えのようです。API を使ってユーザーを追加できると確信しています。詳しくは Discourse API のリバースエンジニアリング方法 を参照してください。

サーバーに負荷がかかりすぎないか気になります。多くの割り当てがあり、以前のアイデアでは、基本的にタグへの割り当てだけで、各トピックに個別に割り当てる必要がありませんでした。

既存のメンテナンスされているプラグインを使用することは、独自のプラグインを開発およびメンテナンスするよりもはるかに簡単です。

簡単なプラグインで実現できます。

実施内容

プラグインは以下のことを行う必要があります。

  1. known_tags という名前のユーザーカスタムフィールド(文字列のリスト)を追加します。

  2. ユーザープロファイルに known_tags を編集できるインターフェースを追加します。これのために完全に新しいプロファイルタブを追加する必要はないと思いますが、必要であれば追加しても構いません。ユーザー自身が編集しないようにしたい場合は、管理者のみが編集できるようにし、CSVファイルに基づいてユーザープロファイルに直接入力してください。

  3. PostCreatorbefore_create_post または post_created イベントを使用するイベントフックを追加し、トピックのタグに基づいて投稿に追加したいコンテンツを追加します。

実装方法

パート1とパート2は、以下のトピックにある他のモデルのサンプルプラグインと非常によく似ています。類推で理解できるか試してみてください。どうしても行き詰まったら、ヒントを求めに来てください。

パート3もプラグインの plugin.rb ファイルに入れます。以下のような形になります。

on(:post_created) |post, opts, user|
  if post.is_first_post? && post.topic.tags.present?
     user_ids = UserCustomField.where(name: 'known_tags', value: post.topic.tags).pluck(:user_id)
     usernames = User.where(id: user_ids).pluck(:username)
     new_raw = post.raw + "something something #{usernames}"
     PostRevisor.new(post).revise!(
      user,
      {
        raw: new_raw,
        edit_reason: "some reason"
      },
      skip_validations: true,
      bypass_bump: true
    )
  end
end

まずはご自身で試してみてください。どうしても行き詰まったらお手伝いします。自分で理解しようと努力している形跡があれば、より協力する気になります :slight_smile:

「いいね!」 2

ロードマップをご提供いただき、誠にありがとうございます。早速取り掛かります。簡単な質問が1つあります。

この部分は、このアプローチでは手動で行う必要がありますか(手動とは、インターフェースを介して1つずつエントリを追加することを意味しますか)?理想的には、CSVファイルはかなり多く、今後も増え続けるため、管理APIキーを使用してこれを行いたいと考えています。

いいえ、手動である必要はありません。CSVに基づいてユーザーカスタムフィールドを埋める方法はいくつかあります。更新をどのように処理したいかによって異なります。他の部分を先に完了し、少量のデータセットでこれをテストすることをお勧めします。次に、それがどのように機能するか満足したら、CSVの自動インポートを追加します。その部分を効率化することは二次的なステップです。

「いいね!」 1