ユーザー情報を一括で更新する方法はありますか?ユーザーデータの更新情報(名前など)をエクスポートしてから、データベースにインポートし直して既存の情報を更新したいと考えています。
管理パネルからCSVをダウンロードできますが、その情報をDiscourseに戻すにはどうすればよいか疑問に思っています。
管理画面で各ユーザーの名前フィールドを一つずつ更新していましたが、再度確認すると更新が空白になってしまいます。
ユーザー情報を一括で更新する方法はありますか?ユーザーデータの更新情報(名前など)をエクスポートしてから、データベースにインポートし直して既存の情報を更新したいと考えています。
管理パネルからCSVをダウンロードできますが、その情報をDiscourseに戻すにはどうすればよいか疑問に思っています。
管理画面で各ユーザーの名前フィールドを一つずつ更新していましたが、再度確認すると更新が空白になってしまいます。
APIを使用するのがおそらく最善の方法ですが、CSVを読み込んでRailsで更新するスクリプトを使用することもできます。
以下は、カスタムユーザーフィールドを更新するRakeタスクです。これを他のものを更新するように変更することもできます。
require "csv"
desc "Import user fields"
task "user_fields:import_csv", [:filename] => [:environment] do |_task, args|
puts "Filename: #{args[:filename]}"
data = CSV.read(args[:filename], headers: true)
data.each_entry do |row|
puts "doing row."
row.to_h.each do |x|
user_id = row["user_id"]
if x.first == "user_id"
u = User.find(user_id)
puts "Got user: #{u.username}"
else
name = x.first
val = row[x.first]
ucf = UserCustomField.find_by(user_id: row["user_id"], name: name)
if ucf
if val != ucf.value
puts "Updating UCF: #{row["user_id"]} Name: #{name}, Found #{ucf.value}}"
ucf.update(value: val)
end
else
if val
puts "Creating UCF: #{row["user_id"]} Name: #{name}, value: #{val}"
UserCustomField.create(user_id: user_id, name: name, value: val)
end
end
end
end
end
end
変更後、コンテナ内の /var/www/discourse/lib/tasks に配置し、rake user_fields:import_csv["YOUR-CSV.csv"] を実行します。
ニーズに合わせて変更するのにヘルプが必要な場合は、CSV(または少なくともヘッダーと最初の数行)をメールで送信してください。見積もりをお送りします。
GitHubにある同じスクリプトはこちらです。
現在、ユーザーのカスタムフィールドのみを対象としており、名前などのフィールドは対象外である点にご注意ください。
それはおそらく、最後に save をクリックしなかったためでしょう。いつか修正されると良いUIの問題です!!
スペースを含む列でも機能しますか、それともフィールドにはアンダースコアが必要ですか?また、エクスポート時に最初の列ヘッダーが id になり、user_id にならないのは問題ですか?
user_field_1のような名前が付けられています。これは、上記でリンクされているGitHubリポジトリで説明されています。
このスクリプトは、ユーザーデータダウンロードを消費するように設計されていません。いくつかの列ヘッダーを変更する必要があります。また、現在の形式では、スクリプトは custom_fields テーブルに格納されている項目のみを更新します。