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

标签 ruby-on-rails optimization devise

我有一个 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 执行批量更新。 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'))

关于ruby-on-rails - Devise:如何快速重置所有用户密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12361025/

相关文章:

ruby-on-rails - 切勿使用 Turbolinks 加载特定路线

javascript - 每个循环内表单上的 Rails Ajax 具有嵌套资源和 html 类

ruby-on-rails - 为什么我们在 Rails 的 new action 下声明 @page = Page.new?

ruby-on-rails - 无法安装 linecache19 gem

SQL 连接一系列值(整数范围、日期范围等)

java - Java 中的局部引用优化

ruby-on-rails-3 - 设计: Sign in from a controller

javascript - 在我的 javascript 文件中插入 Google 分析脚本

ruby-on-rails-3 - 用户注册 Rails3 & Devise 后如何创建配置文件

ruby-on-rails - 设计 crud + 命名空间 : Pro level :)