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 个赞