プロフィールの入力中に利用可能なユーザーフィールド値を動的に更新する

この特定のケースを自動的に更新するソリューションを見つけました。カスタムフィールドオプションのAPI更新の可能性はありません。ここではcronジョブを介したサーバーサイドソリューションしか見つかりませんでした。自動化のためにJSONファイルは使用せず、データベースエントリを使用しました。

ユースケース

この自動化のユースケースは、新規ユーザーが登録時に既存のオプションを選択できるようにすることです。これにより、ユーザーの好みがより多く知られるにつれてシステムを進化させることができます。新しいユーザーが適切なオプションを見つけられない場合は、カスタムテキストフィールドに独自のテキストを入力でき、それを次のユーザーのためにドロップダウンリストに追加できます。

これは注意して使用する必要があります。Discourseのデータベースへの変更はクラッシュする可能性があるため、経験豊富な開発者のみに推奨されます!

要件:

ステップ1:

/admin/customize/user_fieldsで2つのカスタムフィールドを作成します。1つはドロップダウン、もう1つはテキストのみ(私の例では、ユーザーフィールド5のドロップダウン、ユーザーフィールド8のテキスト)です。

注:IDは/admin/customize/user_fields.jsonから取得できます。

ステップ2:

入力内容を確認するには、Discourse Data Explorerを使用するのが最適です:Discourse Data Explorer

/admin/plugins/explorerの下に新しいクエリを作成します:

例:ユーザーフィールドオプション

SELECT * FROM user_field_options WHERE user_field_id='5'

user_field_id='5’をドロップダウンのuser_field_id='x’に変更します。これにより、ドロップダウンオプションに表示される値が出力されます。

2番目のクエリを作成します:

例:ユーザーカスタムフィールド

SELECT * FROM user_custom_fields WHERE name = 'user_field_8'

'user_field_8’をテキストカスタムフィールドの’user_field_x’に変更します。これにより、ユーザーがテキストに入力した値が出力されます。

ステップ3:これは、カスタムフィールドのすべてのオプションがリストされているuser_field_optionsデータベースを更新するためのcronジョブの基本的な基盤です。私の場合、user_field_5に関連付けられた値5があります。そこにオプションを追加したいと考えています。

まず、Discourseのディレクトリにbashスクリプトを作成します。

cd /var/discourse
nano update_dropdown.sh

DiscourseがDockerで実行されている場合は、次のコンテンツを追加します。

#!/bin/bash
cd /var/discourse
docker exec -i app su postgres -c "psql discourse -c \"UPDATE user_custom_fields SET value = (SELECT value FROM user_field_options WHERE user_field_id = 5 AND user_field_options.value = user_custom_fields.value) WHERE name = 'user_field_8' AND value IS NOT NULL AND value NOT IN (SELECT value FROM user_field_options);\""

スクリプトを保存して実行可能にしてください。

chmod +x update_dropdown.sh

次に、スクリプトを開始してテストできます。

cd /var/discourse
./update_dropdown.sh

ステップ4:これを自動化するには、bashスクリプトをcronジョブとして追加する必要があります。

crontab -e

これによりcronジョブエディタが開きます。次の行にコードを追加します。

* * * * * /var/discourse/update_dropdown.sh

これにより、コマンドが1分ごとに実行されます。これはもちろん調整可能であり、update_dropdown.shをサーバーのどこに保存したかによってパスを調整する必要があります。

「いいね!」 3