我想批量删除匹配特定邮箱模式的用户,例如:
- *.xyz
- *.fun
- 等等…
目前我尝试了以下代码:User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count。但我无法在 .where() 之后使用 destroy_all 函数…
能否请您帮忙?
非常感谢。
我想批量删除匹配特定邮箱模式的用户,例如:
目前我尝试了以下代码:User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count。但我无法在 .where() 之后使用 destroy_all 函数…
能否请您帮忙?
非常感谢。
我也想这样做,同时删除这些用户的所有帖子/主题。
User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
具体来说,百分号(%)是一个通配符,代表零个或多个任意字符。因此,%domain.com 表示以 domain.com 结尾的邮箱地址。
与其使用 User#destroy,最好使用 UserDestroyer:
UserDestroyer.new(Discourse.system_user)
.destroy(user, delete_posts: true)
这将使系统用户删除该用户及其所有帖子。
总结如下:
User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
.find_each do |user|
UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
end
请注意,此操作是不可逆的。在真正删除之前,您可能需要验证查询所选的用户。此外,如果您要删除大量用户和/或这些用户拥有大量帖子,我不确定性能影响会如何。
另外,不确定 Anonymizing Users in Discourse 是否可作为您的替代方案?
嗨 @xrav3nz!这个回复太棒了!![]()
这正是我需要的,我现在就试试。当然,我会先按照你的建议,用一个基础的 count() 来确认数量。
有个问题想提一下,这里是不是应该是 delete_post: true 而不是 false?
我的使用场景很简单:我导入了一些旧的 phpBB 数据(感谢 @gerhard),运行得非常顺利。但那个旧论坛充斥着大量虚假账号……他们从未发布过任何帖子,所有邮箱地址看起来都是 .fun 或 .xyz 结尾的。
你说得对!是我打错了!
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.