我有一个 rake 任务(除其他外)将我的生产数据库克隆到我的本地计算机并将所有用户密码重置为password
(或其他)。
我当前的实现看起来像:
User.find_each do |user|
user.password = 'password'
user.save
end
这很好用。但是现在我们有超过 1000 个用户,它变得非常缓慢,而且肯定会变得更糟。
编辑
好的。这是部分答案:
Devise.stretches = 1
User.find_each do |user|
user.password = 'password'
user.save
end
Devise.stretches = 10
这让我的速度提高了 5-10 倍。虽然与基于 SQL 的解决方案相比它可能仍然很慢,但它仍然是一个非常好的改进。这应该扩展到至少 10,000 个用户。
如果我有时间,我可能仍然会使用 SQL 解决方案。
我会暂时搁置这个问题。如果其他人有更好的解决方案,请发布。
最终答案/最佳解决方案
正如一些评论所建议的,最快的解决方案是通过 SQL 执行大规模更新。现在设计允许您encrypted_password
直接设置:
sample_user = User.last
sample_user.password = "password"
encrypted_password = sample_user.encrypted_password
User.update_all(encrypted_password: encrypted_password)
基本上,我们为单个用户设置密码,然后我们可以使用他们encrypted_password
执行批量更新。这个解决方案应该可以扩展到几乎任意数量的用户。
感谢@vladCovaliov 在下面的评论中建议此解决方案。