2010-02-26 38 views
11

我試圖將一些查找表數據保存到YAML文件,以便稍後當我需要在另一臺機器上設置我的應用程序時,我可以將數據作爲種子數據加載。如何從YAML文件加載一些ActiveRecord模型並將它們保存到數據庫?

數據就像選擇選項一樣,它的設置非常多,所以不用擔心序列化和反序列化之間的實時數據更改。

我有輸出這樣的數據...

file = File.open("#{RAILS_ROOT}/lib/tasks/questions/questions.yml", 'w') 
questions = Question.find(:all, :order => 'order_position') 
file << YAML::dump(questions) 
file.close() 

而且我可以加載這樣的文件...

questions = YAML.load_file('lib/tasks/questions/questions.yml') 

然而,當我試圖挽救一個問題,我得到這個錯誤...

>> questions[0].save 
NoMethodError: undefined method `save' for #<YAML::Object:0x2226b84> 

什麼是正確的方法來做到這一點?

+0

您使用的是哪個版本的Rails? – 2010-02-26 03:50:01

+0

我正在使用Rails 2.3.5 – Ethan 2010-02-26 04:27:52

回答

8

我想你的情況,我沒有任何問題。我做了以下更改YAML文件創建邏輯:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
File.open(yml_file, 'w') do |file| 
    questions = Question.order(:order_position).to_a 
    YAML::dump(questions, file) 
end 

我能夠檢索名單questions如下:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
question_attributes_list = YAML.load_file(yml_file).map(&:attributes) 
questions = Question.create(question_attributes_list) 
1

如果您使用的是Rails 2.3.4(或更高版本),他們有一個seeds.rb文件,該文件可以在您的應用程序db文件夾中找到。這讓你定義基本活動記錄造成的,而當你已經設置了新的項目,你可以簡單地調用:

rake db:seed 

有它here一個優秀的Railscast,和良好的博客帖子大約是here。如果您沒有使用Rails 2.3.4(或理想情況下爲2.3.5),我強烈建議您更新這些很酷的功能,並增加安全性/錯誤修復。

+0

謝謝,是的,這是一個很棒的功能。我想將數據存儲在YAML文件中並使用'seeds.rb'加載它。有足夠的數據直接在'seeds.rb'中對模型實例進行硬編碼會很困難。 – Ethan 2010-02-26 04:29:48

+0

seeds.rb只是一個紅寶石文件。您可以按照此處所述(http://ruby-doc.org/core/classes/YAML.html)加載seeds.rb中的YAML,並在執行Model.create()時簡單地循環訪問數組。 – 2010-02-26 04:31:59

20

db目錄下創建一個seed.yml文件。爲您要創建的每個模型添加一個YAML文檔。這個文件應該包含一個哈希列表。每個哈希應該包含模型屬性。

users: 
     - login: jake 
      password: jake123 
      password_confirmation: jake123 
      first_name: Jake 
      last_name: Driver 

     - login: Jane 
      password: jane123 
      password_confirmation: jane123 
      first_name: Jane 
      last_name: McCain 

    categories: 

    products: 

在你seed.rb文件

seed_file = File.join(Rails.root, 'db', 'seed.yml') 
config = YAML::load_file(seed_file) 
User.create(config["users"]) 
Category.create(config["categories"]) 
Product.create(config["products"]) 

運行rake任務來加載行

rake db:seed 
+0

男人,這是非常有用的知道。謝謝。它在Rails 4中仍然有用嗎? – Batman 2015-11-02 17:42:07

+0

@Batman我這麼認爲。這依賴於標準的YAML解析器和AR數組創建方法。 – 2015-11-02 20:21:39

10

是否接受的答案其實回答這個問題?它看起來像提交者想要保存模型,而不是從YAML文件中檢索它們。

實際上保存加載的模型返回到數據庫你需要愚弄ActiveRecord認爲模型需要保存。你可以用這個相當髒的代碼來做到這一點

questions = YAML.load_file("#{RAILS_ROOT}/lib/tasks/questions/questions.yml") 
questions.each{|q| q.instance_variable_set("@new_record", true); q.save} 

它的工作原理和保存我的培根一兩次。

+0

謝謝,這是我需要得到它的工作。 – Jurgen 2012-06-20 15:16:13

+0

這應該是被接受的答案。謝謝! – cschille 2014-09-17 02:59:58