외부 SSO 제공자(WordPress를 통해)가 계정 생성 시 어떻게 설정되어 있었는지 때문에, 포럼에서 몇백 명의 사용자 이름(사용자 이름이 아니라 이름)이 이메일 주소로 잘못 설정된 상태입니다.
각 프로필에 들어가서 하나씩 수동으로 수정하지 않고, the_name@example.com을 the_name으로(즉, '@'부터 이후의 모든 것을 잘라내는 것) 일괄 변경할 수 있는 비교적 간단한 방법이 있을까요?
외부 SSO 제공자(WordPress를 통해)가 계정 생성 시 어떻게 설정되어 있었는지 때문에, 포럼에서 몇백 명의 사용자 이름(사용자 이름이 아니라 이름)이 이메일 주소로 잘못 설정된 상태입니다.
각 프로필에 들어가서 하나씩 수동으로 수정하지 않고, the_name@example.com을 the_name으로(즉, '@'부터 이후의 모든 것을 잘라내는 것) 일괄 변경할 수 있는 비교적 간단한 방법이 있을까요?
rails 콘솔에서 수행할 수 있습니다. 여기에서 설명하기에는 다소 복잡한데, 특히 이메일 주소가 더 이상 사용자 레코드에 저장되지 않기 때문입니다. 예산이 있다면 Marketplace 채널에 게시하거나 저에게 직접 연락해 주세요.
아니면 실제 이메일 주소에 신경 쓰지 않는다면…
다음과 같은 코드를 사용할 수 있습니다.
users = User.where ('username like'%@%''")
그 다음 루프를 돌리면서 gsub를 사용해 @부터 끝까지 모두 제거하면 됩니다. 제 폰에서 할 수 있는 일은 이것까지입니다.
@pfaffman님의 답변에 감사드립니다. SQL은 작성할 수 있지만, Rails 콘솔에서 작업하는 것은 제 전문 분야가 아닙니다. Discourse의 Python 콘솔에 어떻게 접근할 수 있을까요? ![]()
데이터 탐색기(Data Explorer)처럼 UPDATE 쿼리도 작성할 수 있는 도구가 있으면 좋겠지만, 동시에 위험할 수도 있다는 점은 이해합니다.
자체 호스팅(self-hosted) Docker Discourse에서 실행 중인 데이터베이스에 제3자 SQL 도구(Sequel Pro 또는 유사한 도구)를 연결할 방법이 있는지 아시는 분이 있을까요?
네, 하지만 Rails에서 작업하면 데이터베이스를 망칠 가능성이 훨씬 낮습니다. 예를 들어, Rails를 사용하면 사용자 이름에 불법적인 문자가 포함되어 있는지 확인할 수 있고(또는 수정 중인 테이블을 변경할 때 다른 테이블도 업데이트해야 하는 경우, Rails는 자동으로 처리해 주지만 SQL은 그렇지 않습니다).
cd /var/discourse
./launcher enter app
rails c
이제 Rails 환경에 들어간 것입니다.
users=User.where("username like '%@%'")
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "New name: #{user.name}"
# user.save
end
이 코드가 원하는 작업을 수행할 것 같습니다. 결과가 괜찮아 보인다면 user.save 주석을 해제하고 시도해 볼 수 있습니다.
먼저 백업을 꼭 해두세요, 알았죠? (아니면, 더 좋게 말하면 스테이징 서버에서 하세요.)
와, 코드 감사합니다!
이 디스코urs 인스턴스를 위한 스테이징 서버는 없지만, 백업을 해두고 내일 아침에 트래픽이 거의 없거나 없을 때 코드를 실행해서 문제가 발생하면 즉시 복원할 수 있도록 하겠습니다.
@pfaffman 감사합니다.
puts가 괜찮아 보인다면 꽤 안전할 거예요. 고마워요!
@에서 잘라내는 방식은 여전히 개인 정보(이메일 주소)가 인터넷에 거의 그대로 노출됩니다(대부분의 사용자가 @gmail.com 또는 다른 몇몇 대형 제공자를 사용하므로). 사용자 이름과 동일한 값으로 설정하는 것이 더 나을 것입니다.
@lionel-rowe, 좋은 지적 감사합니다. 다만 사용자 이름은 이미 그 값과 동일합니다(사용자 이름은 이메일 주소에서 ‘@’ 이전의 모든 문자를 가져와서 생성되었기 때문입니다).
정말 끔찍합니다.
동작하도록 하려면 코드에 작은 수정을 가하고 간단한 절차를 추가해야 했습니다. 수정된 코드는 다음과 같습니다:
users=User.where("name like '%@%'")
그런 다음 레일즈 콘솔이 사용자 데이터를 “more” 명령으로 페이지 넘기듯 표시하더군요. 그래서 q로 빠져나와야 했습니다. 그 후:
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "New name: #{user.name}"
# user.save
end
그럼 레일즈 콘솔이 새로운 이름 목록(정확합니다!)을 표시한 뒤, 다시 사용자 목록의 “more” 화면으로 돌아갑니다. 다시 q를 입력합니다.
그 후:
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "New name: #{user.name}"
user.save
end
…이제 이메일 주소가 포함된 사용자 이름은 더 이상 없고, 포럼 프론트엔드에서도 모든 것이 정상적으로 보입니다.
@pfaffman, 너그러운 도움에 다시 한번 감사드립니다.