admin_detailed_user_serializer 문제

안녕하세요,

admin_detailed_user_serializer와 관련하여 문제가 발생하고 있습니다. 관리자가 사용자 검색에서 사용자를 조회할 때 500 오류가 발생하고 있습니다. https://mycommunity/admin/users/2000020409.json에 대한 GET API 호출 시에도 동일한 500 오류가 발생합니다. 아래는 로그에서 가져온 예외 정보입니다. 약 50%의 사용자에게 이 오류가 발생하고 있습니다. 데이터베이스에서 정상 작동하는 사용자와 작동하지 않는 사용자를 비교해 보았지만, 문제의 원인을 파악하지 못하고 있습니다. 다른 시스템에서 사용자 마이그레이션을 수행하던 중 제가 한 작업이 이 문제를 일으켰을 것으로 추정됩니다.

아래는 제가 수행한 데이터 마이그레이션 단계입니다:

  1. users, user_profiles, user_emails, user_stats 테이블에 데이터를 수동으로 삽입했습니다.
  2. 초기에는 모든 사용자의 이메일이 'someid@example.com’이었습니다.
  3. 이후 user_email 테이블을 업데이트하여 해당 사용자의 올바른 이메일을 설정했습니다.
  4. 이 시점부터, 이 사용자 중 50%는 관리자 사용자 목록에서 조회할 수 없음을 확인했습니다. 그러나 프로필 목록에서 이름에 마우스 오른쪽 버튼을 클릭하여 프로필 카드를 표시하면, 그곳에서 클릭하여 프로필을 정상적으로 볼 수 있습니다. 프로필 업데이트는 가능하지만, 특정 사용자를 관리자로 설정하려고 하면 아래에 나열한 것과 동일한 500 오류가 발생합니다.

이 코드가 무엇을 확인하고 있는지 아시는 분이 계신가요? 일부 사용자에게 이 500 예외를 일으키는 중요한 데이터가 누락되어 있을 것으로 추측됩니다. 혹시 추측이 있으신 분이 계신가요? 저는 Discourse 초보자인데, 조언을 주시면 감사하겠습니다.

감사합니다!


app/serializers/admin_user_list_serializer.rb:95:in `time_read'
(eval):27:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:468:in `rescue in attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:455:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:89:in `block in _serializable_array'
activerecord (7.0.4.3) lib/active_record/relation/delegation.rb:88:in `each'
activerecord (7.0.4.3) lib/active_record/relation/delegation.rb:88:in `each'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:79:in `map'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:79:in `_serializable_array'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:73:in `serializable_array'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:53:in `as_json'
app/serializers/admin_detailed_user_serializer.rb:166:in `similar_users'
(eval):72:in `_fast_attributes'
active_model_serializers (0.8.4

이 정보가 도움이 되지 않을 수도 있지만, 문제의 시작점이 여기인 것 같습니다. 사용자를 생성할 때 데이터에 대한 모든 검증을 수행할 수 있도록 Rails를 사용하여 사용자를 생성하는 것이 훨씬 나았을 것입니다.

아마도 이 단계에서 문제가 발생한 것 같습니다.

이 사이트는 운영 중입니까, 아니면 처음부터 다시 시작할 수 있는 테스트 사이트입니까? 문제를 일으키는 것보다, 무엇이 깨졌는지 파악하고 어떻게 수정할지 알아내는 것이 훨씬 쉬울 것입니다.

active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:53:in as_json' app/serializers/admin_detailed_user_serializer.rb:166:in similar_users’
(eval):72:in `_fast_attributes’

아마도 중복된 이메일 주소를 가진 사용자가 있다는 뜻일까요?

수정: 그 문제는 아닌 것 같습니다.

제가 추천하는 방법은 https://github.com/discourse/discourse/tree/master/script/import_scripts를 확인하고, 그 중 하나를 기반으로 자신의 스크립트를 작성하여 데이터를 가져오는 것입니다. Rails와 Discourse에 대한 깊은 이해가 없다면 데이터베이스를 직접 조작하는 것은 재앙을 초래할 수 있습니다.

답변해 주셔서 감사합니다. 다만 이 사이트는 현재 운영 중인 프로덕션 환경이라 처음부터 다시 시작하기보다는 대안을 찾고 있습니다. 로그인 시 사용자 프로필이 정상화되고 500 에러 메시지가 사라지는 것을 확인했습니다. 따라서 로그인 과정에서 사용자의 문제가 해결되는 원인을 파악해 보고 있습니다.

이거 맞나요? 그리고 로그인하면 time_read에 값을 추가하는 건가요?

잘하셨네요, @JammyDodger! 그게 정답일 것 같아요!

확인해볼 또 다른 방법은 사용자 모델에 있는 ensure_consistency 메서드입니다. 소스 코드를 찾아보거나, 아래처럼 직접 시도해볼 수 있어요.

u=User.find(123)
u. ensure_consistency! 

아니면 ! 없이 시도해볼 수도 있겠죠.