如何从YAML文件加载一些ActiveRecord模型并将其保存到数据库?

我正在尝试将一些查找表数据保存到YAML文件中,以便稍后当我需要在另一台机器上设置我的应用程序时,我可以将数据作为种子数据加载。

数据就像选择选项一样,而且几乎可以设置,因此不必担心序列化和反序列化之间的实时数据变化。

我输出了这样的数据……

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文件创建逻辑进行了以下更改:

 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) 

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 

接受的答案是否真的回答了这个问题? 看起来问问者想要保存模型,而不仅仅是从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} 

它起作用并保存了我的培根一两次。

如果您使用的是Rails 2.3.4(或更高版本),则它们有一个seeds.rb文件,可以在您的应用程序db文件夹中找到。 这使您可以定义基本的活动记录创建,当您设置新项目时,您只需调用:

 rake db:seed 

这里有一个很棒的Railscast ,还有一篇关于它的好博客文章。 如果您不使用Rails 2.3.4(或者理想情况下,2.3.5),我强烈建议您更新这些很酷的function,以及添加安全性/错误修复。