Can’t fix tag names with dots/periods에서 이어지는 논의입니다:
안녕하세요,
rails 콘솔에서 태그 이름을 변경하는 방법에 대해 테스트된 가이드를 공유해 주실 수 있나요? rails 콘솔 사용 경험이 전혀 없어서 데이터베이스를 망가뜨리고 싶지 않습니다…
Can’t fix tag names with dots/periods에서 이어지는 논의입니다:
안녕하세요,
rails 콘솔에서 태그 이름을 변경하는 방법에 대해 테스트된 가이드를 공유해 주실 수 있나요? rails 콘솔 사용 경험이 전혀 없어서 데이터베이스를 망가뜨리고 싶지 않습니다…
서버에 SSH로 접속하세요
cd /var/discourse
./launcher enter app
rails c
t = Tag.find_by_name('oldname')
t.name = 'newname'
t.save
특정 태그를 모든 토픽에서 변경하는 방법도 있을까요? 이전에 도메인을 변경했을 때, 기존 도메인에 대한 모든 참조를 새 도메인으로 다시 작성하는 방법이 있었습니다. 태그에도 이렇게 할 수 있을까요? 태그 이름을 변경하고 싶지만, 존재하지 않는 태그로 인해 사용자가 혼란을 겪지 않도록 하려고 합니다.
수정: 태그 동의어(tag synonyms)로 해결했습니다
하지만 이는 이상적이지 않습니다. 기존 태그 사용이 계속되며, 태그 개요와 자동완성에도 표시되기 때문입니다. 기존 태그를 완전히 대체하고 폐기하는 것이 훨씬 좋았을 것입니다.
솔직한 질문인데, 태그 이름을 변경하는 것만으로 충분하지 않은 이유는 무엇인가요?
추가로 @RGJ님께 감사드립니다, 정말 부드럽게 잘 작동했어요
![]()
사용자가 토픽에서 사용한 기존 태그를 이름 변경할 수 있는 방법이 없는 것 같습니다. 토픽 제목에 있는 태그가 아니라, 실제로 댓글에 있는 태그를 말하는 건데요.
책임自负로 사용하세요!
#foo를 #bar로 이름 변경한 이후에 이 작업을 수행하세요.
Post.where("raw like '%#foo%'").each do |p|
p.raw = p.raw.gsub(/#foo\b/, '#bar')
p.save!
end
멋지네요! 미리 알려주셔서 감사합니다. 백업으로 위험을 줄일 수 있겠네요
.
제 이해가 맞는지 확인하고 싶은데, "raw like '%#foo%'"는 정확한 매칭을 의미하나요? 예를 들어 #access 태그를 #access_granted로 이름 변경해야 하는 경우, "raw like '%#access%'"가 #access와 #access_granted 모두에 매칭되나요? 만약 그렇다면 이미 #access_granted를 사용 중인 기존 댓글들이 #accessaccess_granted로 이름 변경될 수도 있겠네요.
grep 명령어와 비교하자면, --word-regexp 옵션이 도움이 되며 전체 단어만 매칭되도록 해줍니다.
맨 페이지(사용 설명서)에는 다음과 같이 설명되어 있습니다:
전체 단어만 매칭되는 행을 선택합니다. 매칭되는 부분 문자열이 행의 시작부에 있거나, 단어 구성 요소가 아닌 문자 앞에 위치해야 합니다. 마찬가지로, 행의 끝부에 있거나 단어 구성 요소가 아닌 문자 뒤에 위치해야 합니다. 단어 구성 요소 문자는 문자, 숫자, 밑줄입니다.
이 명령어도 비슷한 방식으로 작동하나요? 물론 백업을 하고 명령어를 실행해 보면 알 수 있습니다. 하지만 위험을 이해하기 위해 물어보는 것이니, 아시면 알려주시면 좋겠습니다. 그렇지 않다면, 그냥 해보는 수밖에 없네요(YOLO).
"raw like '%#foo%'"는 엄밀한 매칭이 아닙니다. 하지만 그럴 필요도 없습니다. LIKE % 쿼리는 성능 면에서 매우 비효율적이기 때문에, 태그 뒤에 비단어 문자를 요구하도록 하는 것만으로도 성능을 더 악화시키지 않도록 선택했습니다. where 쿼리는 단순히 사전 선택을 위해 존재할 뿐이며, 실제로는 Post.all.each를 사용해도 동작합니다(다만 훨씬 느릴 뿐입니다).
실제 치환은 gsub에 의해 수행되며, \b는 태그 뒤에 단어 경계가 존재하도록 보장합니다. 즉, 태그가 거기서 끝난다는 뜻입니다.
따라서 #access_granted를 포함하는 모든 게시물이 매칭되고 내부 코드가 실행되지만, 해당 경우 gsub는 아무것도 하지 않습니다.
irb(main):010:0> "Tag #access is here".gsub(/#access\b/, "#access_granted")
=> "Tag #access_granted is here"
irb(main):011:0> "Tag #access_granted is here".gsub(/#access\b/, "#access_granted")
=> "Tag #access_granted is here"
지금 이 코드를 실행하려고 합니다:
Post.where("raw like '%#access%'").each do |p|
p.raw = p.raw.gsub(/#access\b/, '#strategic_access')
p.save!
end
Post.where("raw like '%#feedback%'").each do |p|
p.raw = p.raw.gsub(/#feedback\b/, '#digital_feedback')
p.save!
end
하지만 bash: syntax error near unexpected token “raw like ‘%#access%’”'및bash: syntax error near unexpected token "raw like '%#feedback%'"' 오류가 발생합니다. 추측하기 전에, #를 이스케이프해야 하나요?
이 코드 이후에 실행되어야 했는데, 코드는 rails c 안에서 실행되어야 합니다
아, 네. bash 오류를 전혀 못 봤네요. 좀 더 잘 걸어야겠어요… 감사합니다!!