2011-03-25 47 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