一括でユーザー情報を更新

ユーザー情報を一括で更新する方法はありますか?ユーザーデータの更新情報(名前など)をエクスポートしてから、データベースにインポートし直して既存の情報を更新したいと考えています。

管理パネルからCSVをダウンロードできますが、その情報をDiscourseに戻すにはどうすればよいか疑問に思っています。

管理画面で各ユーザーの名前フィールドを一つずつ更新していましたが、再度確認すると更新が空白になってしまいます。

「いいね!」 1

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(または少なくともヘッダーと最初の数行)をメールで送信してください。見積もりをお送りします。

「いいね!」 3

GitHubにある同じスクリプトはこちらです。

現在、ユーザーのカスタムフィールドのみを対象としており、名前などのフィールドは対象外である点にご注意ください。

それはおそらく、最後に save をクリックしなかったためでしょう。いつか修正されると良いUIの問題です!!

「いいね!」 1

スペースを含む列でも機能しますか、それともフィールドにはアンダースコアが必要ですか?また、エクスポート時に最初の列ヘッダーが id になり、user_id にならないのは問題ですか?

user_field_1のような名前が付けられています。これは、上記でリンクされているGitHubリポジトリで説明されています。

このスクリプトは、ユーザーデータダウンロードを消費するように設計されていません。いくつかの列ヘッダーを変更する必要があります。また、現在の形式では、スクリプトは custom_fields テーブルに格納されている項目のみを更新します。