2010-12-15 18 views
3

rake任務(這實際上是關於耙&一個新手的問​​題Rails的&依賴一般。試圖環繞這一切是如何結合在一起的我的頭)如何設置播種

基本上,我想瑞克類似seed.rb的任務,但單獨調用。它爲開發環境添加了測試數據,而我的seed.rb爲所有環境提供了基本數據。

腳本family_seed.rb使用FactoryGirl生成一些記錄。它看起來像這樣:

require File.expand_path('../../config/environment', __FILE__) 
require './spec/factories' 

Family.delete_all 
Member.delete_all 
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 

它運行罰款bundle exec "ruby db/family_seeds.rb",但我的問題是,如何用Rake設置。整個事情應該放在Rake任務中嗎?我怎樣才能設置一個調用腳本的任務,同時確保Rails開發環境在運行時可用?我不僅要完成工作,還要以「正確」的方式完成工作。解決這個

回答

5

一種方法是建立在LIB類或模塊(這使得它更容易編寫的測試,使代碼的可重用性):

require '../spec/factories' 

class FamilySeed 

    def self.seed 
    raise "Don't run this in production!" if Rails.env.production? 

    Family.delete_all 
    Member.delete_all 
    zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
    blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 
    end 

end 

然後創建一個rake任務,例如作爲:

require 'family_seed' 

namespace :seed do 
    task :families => :environment do 
    FamilySeed.seed 
    end 
end 

我會小心讓像Family.delete_all和Member.delete_all的東西過於自由地使用。稍後,您可以通過在生產數據庫中調用您不想要的東西來輕鬆地拍攝自己。

+0

這是一個很好的警告!有什麼方法可以確保任務只在給定環境中運行? FamilySeed類等對象是否可以檢查環境以查看它是測試還是生產? – 2010-12-15 10:59:33

+0

如果rails env是production,我已經更新了代碼以引發異常。 – idlefingers 2010-12-15 11:04:02

2

創建一個rake任務和要求:環境

task :delete_all => :environement do 
    require Rails.root.join('spec/factories') 
    Family.delete_all 
    Member.delete_all 
    zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
    blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 
end 

後,您可以運行此任務rake delete_all

+1

這很適合展示如何在一項任務中完成所有工作。我錯過的關鍵是... =>:環境位。我喜歡「delete_all」作爲任務名稱 - 使其不太可能偶然運行。 – 2010-12-15 11:37:32