如何有效地为Devise用户提供种子?

Ale*_*vik 4 mysql performance ruby-on-rails devise

我正试图在我的Rails 3项目中使用rake db:seed为大约100,000个用户播种,这真的很慢!

这是代码示例:

# ...
User.create!(
  :display_name => "#{title} #{name} #{surname}",
  :email => "#{name}.#{surname}_#{num}@localtinkers.com",
  :password => '12341234'
)
Run Code Online (Sandbox Code Playgroud)

它有效,但它真的很慢,因为每个用户:

  1. 设计发出SELECT语句以查明电子邮件是否已被采用.
  2. 发出单独的INSERT语句.

对于其他对象,我使用" ar-extensions "和" activerecord-import "gems,如下所示:

tags.each do |tag|
  all_tags << Tag.new(:name => tag)
end

Tag.import(all_tags, :validate => false, :ignore => true)
Run Code Online (Sandbox Code Playgroud)

上面为所有标记创建了一个INSERT语句,它的工作速度非常快,就像从SQL转储中恢复MySql数据库一样.

但对于用户我不能这样做,因为我需要Devise为每个用户生成加密密码,盐等.有没有办法在SQL端生成它们,还是有其他有效的方式来播种用户?

谢谢.

Pau*_*ell 9

怎么样:

u = User.new(
  :display_name => "#{title} #{name} #{surname}",
  :email => "#{name}.#{surname}_#{num}@localtinkers.com",
  :password => '12341234'
)
u.save!(:validate => false)
Run Code Online (Sandbox Code Playgroud)

应该创建并保存记录而不执行验证,因此不检查电子邮件地址的唯一性.显然,这样做的缺点是您没有受到用户的任何其他验证的保护,因此请务必先检查您的数据!

  • 嗯,刚刚快速浏览了一下,Devise 似乎不是这样工作的。在我看来,salt 等是在 DatabaseAuthenticatable 的 password= 方法中生成的,所以我不太明白为什么你不能只执行 User.new(而不是创建),然后传递给 activerecord-import? (2认同)