2011-03-25 30 views
3

我试图种子使用rake db的大约100,000个用户:种子在我的Rails 3项目中,它非常慢!如何高效地设计用户?

下面的代码示例:

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

它的工作原理,但它是很慢,因为每个用户:

  1. 设计发出SELECT语句,以找出是否电子邮件已经拍摄。
  2. 发出单独的INSERT语句。

对于其他对象,可以使用“AR-扩展”和“ActiveRecord的进口”宝石如下:

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

Tag.import(all_tags, :validate => false, :ignore => true) 

以上所有的标签和它创建只是一个INSERT语句作品真的很快,就像MySql数据库从SQL转储中恢复一样。

但对于用户我不能这样做,因为我需要Devise为每个用户生成加密密码,盐等。有没有一种方法可以在SQL方面生成它们,或者有其他有效的种子用户方法吗?

谢谢。

回答

8

如何:

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

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

+0

这消除了每个新用户的子弹1:“选择”语句,它的工作速度稍快一点,但最慢的是“插入”的样子。种子中的数据用于测试,因此无需验证即可。 这将是很好,如果我可以为10,000个用户做一个“插入”... 感谢您的提示,但它有帮助。 – 2011-03-25 15:52:33

+1

对不起,gotcha - 没有发现大宗进口。只是一个想法:你能以某种方式手动触发设计的before_save钩子,假设它是如何工作的? – 2011-03-25 16:19:37

+0

这实际上是个好主意!我很确定我可以,即使其中一些方法是私有的 - 我仍然可以调用它们,因为Ruby是一种令人敬畏的编程语言。然后,我将汇总一组原始数据,然后发出一个批量插入语句...谢谢你,我将你的答案标记为正确。 :) – 2011-03-25 16:29:15

相关问题