2011-08-08 53 views
13

如何使用YAML文件,而不是seeds.rb初始數據加載到數據庫中裝載種子數據?Ruby on Rails的:從YAML文件

+0

看到作爲公認的答案不是很大(放入'測試/'目錄種子數據)和[我的回答](http://stackoverflow.com/a/24957205/405550 )有更多upvotes,請你考慮接受我的? – Zaz

回答

3

退房的Ruby on Rails的指南夾具:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

一般情況下,你可以創建在test/目錄YAML夾具文件,然後使用rake db:fixtures:load命令將它們加載到數據庫中。在所有很酷的東西,你可以用燈具做完整的文檔是在這裏:

http://api.rubyonrails.org/classes/Fixtures.html

+3

同樣的事情可以用於開發或生產嗎? – fijiaaron

+1

最後一個鏈接已損壞。另外,從'test /'加載種子數據似乎不是正確的做事方式。 – Zaz

+0

這讓我感到不舒服爲好,但在實踐中有的人用燈具來填充用於測試目的的數據。在兩個地方有相同的yaml播種文件,感覺更加... icky。 – jaydel

19

添加代碼db/seeds.rb來解析YAML文件,如:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

然後,只需將YAML fie在db/seeds/categories.yml。 YAML文件應該是關聯數組列表,例如:

- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

這種解決方案的問題是,如果你運行'耙分貝:seed'第二時間,你會得到一堆重複。根據唯一性的要求,您可能想要修改最後一行,如下所示:'config.each {| values | Category.first_or_create(值)}' – sberkley

+0

在你想播種兩次數據庫什麼情況呢? 'rake db:reset'可以完成99%的時間。 – Zaz

+2

如果您向表中添加種子值或添加帶有種子值的新表格。丟棄整個數據庫可能是開發環境中的解決方案,但肯定不是在生產環境中。如果在另一個表中有任何對該表ID的引用,則在重新播種之前刪除播種表也不是一種選擇。如果您需要刪除以前播種的值,情況會變得更加複雜,並且可能需要超出'rake db:seed'的解決方案。 – sberkley

2

我用@Zaz回答的答案。它工作得很好。

但是在此期間,如果出現了一些問題你的種子數據(例如你有一個非常大的種子YAML文件),你想知道,你的YAML的一部分出了問題。那時你可以在創建後添加一個塊!對於這樣的調試:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end