ruby-on-rails – 设计:如何快速重置所有用户密码

我有一个rake任务(除此之外)将我的生产数据库克隆到我的本地机器并将所有用户密码重置为密码(或其他).

我目前的实现看起来像:

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执行批量更新. Devise现在允许您直接设置encrypted_pa​​ssword:

sample_user = User.last
sample_user.password = "password"
encrypted_password = sample_user.encrypted_password
User.update_all(encrypted_password: encrypted_password)

基本上,我们在单个用户上设置密码,然后我们可以使用他们的encrypted_pa​​ssword来执行批量更新.此解决方案应扩展到几乎任何数量的用户.

感谢@vladCovaliov在下面的评论中提出此解决方案.

最佳答案 通常我会说写你想要的sql,例如

ActiveRecord::Base.connection.execute(' update users set encrypted_password = 'password') 

但通常密码是加密的,您可以使用MD5或授权/身份验证机制(如Devise或Authlogic)直接对其进行加密.在这种情况下,您实际上通过传入必须匹配的密码和密码确认值(在Rails中创建记录时)来创建或更改密码.如果它们匹配,则密码被加密并实际存储在数据库中.由于这些原因,除非您在直接sql中使用散列算法,否则必须逐个完成.

它可能很简单

ActiveRecord::Base.connection.execute(' update users set password = md5('password'))
点赞