2009-02-20 50 views
3

在Rails應用程序中,我需要在我的數據庫中包含一個表來包含常量數據。填充常量值表

此表內容目前不打算改變,但我不想將內容放在代碼中,以便能夠在需要時進行更改。

我試圖在創建它的遷移中填充此表,但這似乎不適用於測試環境並打破了我的單元測試。在測試環境中,我的模型在我的開發環境中無法返回任何值。

即使在測試環境中,是否可以正確填充該數據庫?有沒有辦法處理這些不應該在代碼中的數據?

編輯

感謝所有的答案,尤其是弗拉德R代表解釋問題。

我現在明白爲什麼我的數據沒有在測試中加載。這是因爲測試環境使用db:load rake命令,它直接加載模式而不是運行遷移。將我的值放入遷移而不是架構中後,這些值不會加載以進行測試。

回答

3

你可能注意到的是,測試框架沒有運行遷移(db:migrate),而是直接加載db/schema.rb(db:load)。

你有兩個選擇:

  1. 繼續使用,生產和開發遷移;對於測試環境,將您的常量數據添加到db/fixtures中相應的yml文件中
  2. 不改變現有的db/fixtures文件,並創建另一組yml文件(包含常量數據),與db /但是可以在測試和生產/開發環境中使用時做rake db:加載模式初始化

要覆蓋那些使用db:load(而不是db:migrate - 例如測試,創建一個新的數據庫在新的開發機器上使用更快的db:load而不是db:migrate等)在RAILS_APP/lib/tasks中創建一個嵌入式RAKE文件,通過從「seed」中加載常量初始化數據來擴充db:load任務「yml文件(每個模型一個)到數據庫中。

以db:seed rake任務爲例。把你的種子數據DB /種子/ .yml

#the command is: rake:db:load 
namespace :db do 
    desc 'Initialize data from YAML.' 
    task :load => :environment do 
    require 'active_record/fixtures' 
    Dir.glob(RAILS_ROOT + '/db/seeds/*.yml').each do |file| 
     Fixtures.create_fixtures('db/seeds', File.basename(file, '.*')) 
    end 
    end 
end 

爲了彌補增加的情況下(DB:遷移),定義一個遷移,做同樣的事情上面定義的任務。

如果你的種子數據發生改變,你將需要添加另一個遷移刪除舊的種子數據並加載新的一個替代,這可能是不平凡的外鍵的依賴等

2

的情況下,看看我的文章loading seed data

有很多方法可以做到這一點。我喜歡一個叫做db:populate的耙子任務,它可以讓你在普通的ActiveRecord創建語句中指定你的固定數據。爲了將數據導入到測試中,我只是在我的test_helper中加載這個填充文件。但是,我想我將切換到已經有種子數據填充的測試數據庫。

還有一個名爲SeedFu的插件可以幫助解決這個問題。

不管你做什麼,我都建議不要使用燈具,因爲他們不驗證你的數據,所以很容易創建無效的記錄。