admin_detailed_user_serializer の問題

こんにちは。

管理者がユーザー検索からユーザーを表示しようとすると、admin_detailed_user_serializer で 500 エラーが発生する問題が発生しています。また、https://mycommunity/admin/users/2000020409.json への GET API 呼び出しでも 500 エラーが発生しています。以下はログからの例外です。ユーザーの約 50% でこのエラーが発生しています。データベースで正常に表示されるユーザーとエラーが発生するユーザーを比較しましたが、問題の原因を特定できませんでした。別のシステムからユーザーを移行した際に、何らかの問題が発生したのではないかと疑っています。

以下は、データ移行の手順です。

  1. usersuser_profilesuser_emailsuser_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’

これは、ユーザーが重複したメールアドレスを持っていることを意味するのでしょうか?

編集:それは違うと思います。

お勧めするのは、discourse/script/import_scripts at main · discourse/discourse · GitHub を見て、ベースにするスクリプトを見つけ、そのようなスクリプトを使用してデータをインポートすることです。Rails と Discourse を熟知していない限り、データベースを直接操作することは悲劇の元です。

「いいね!」 1

返信ありがとうございます。感謝いたします。残念ながら、これはライブ本番サイトですので、最初からやり直すのではなく、代替案を検討しています。ユーザーがログインすると、プロファイルが修正され、500エラーメッセージが消えることに気づきました。そのため、ログインプロセス中にユーザーが修正される原因を突き止めようとしています。

「いいね!」 1

これですか?そして、ログインすることで time_read に値が追加されるのですか?

「いいね!」 2

素晴らしい仕事だ、@JammyDodger!きっとそれが決め手になるだろう!

もう一つ探すべきなのは、ユーザーモデルの ensure_consistency メソッドだ。ソースコードを見るか、試してみることもできる。

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


あるいは ! なしで。

「いいね!」 2