사용자 정보 일괄 업데이트

사용자 정보를 일괄 업데이트하는 방법이 있을까요? 이름 등 사용자 데이터의 업데이트 정보를 내보낸 뒤, 이를 다시 데이터베이스에 가져와 기존 정보를 업데이트하고 싶습니다.

관리자 패널에서 CSV 파일을 다운로드할 수는 있지만, 이 정보를 다시 Discourse에 반영하는 방법을 알고 싶습니다.

관리자 화면에서 각 사용자를 하나씩 직접 업데이트(이름 필드)하고 있었는데, 다시 들어가 보면 업데이트된 내용이 비어 있는 상태입니다.

최고의 방법은 아마도 API를 사용하는 것일 것입니다. 하지만 CSV 파일을 읽고 rails에서 업데이트하는 스크립트를 작성하는 것도 가능합니다.

사용자 정의 사용자 필드를 업데이트하는 레이크(rake) 태스크입니다. 필요에 따라 수정하여 다른 항목도 업데이트할 수 있습니다:


require "csv"
desc "Import user fields"
task "user_fields:import_csv", [:filename] => [:environment] do |_, 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에서 확인할 수 있습니다:

현재 사용자 커스텀 필드만 지원하며, 이름과 같은 필드는 지원하지 않습니다.

각 편집을 마칠 때 저장 버튼을 누르지 않았기 때문일 가능성이 높습니다. 언젠가 해결되었으면 하는 UI 관련 문제입니다!!

공백이 포함된 컬럼에서도 동작하나요, 아니면 필드에 밑줄을 사용해야 하나요? 또한 내보내기 시 첫 번째 컬럼 헤더가 user_id가 아닌 id로 표시됩니다. 문제가 될까요?

이름이 user_field_1 같은 형식입니다. 이는 위에서 링크된 GitHub 저장소에서 어느 정도 설명되어 있습니다.

이 스크립트는 사용자 데이터 다운로드를 소비하도록 설계되지 않았습니다. 여러 열 헤더를 수정해야 합니다. 또한 현재 형태로 스크립트는 custom_fields 테이블에 저장된 항목만 업데이트합니다.