Ruby on rails 如何从YAML文件加载一些ActiveRecord模型并将其保存到DB?

Ruby on rails 如何从YAML文件加载一些ActiveRecord模型并将其保存到DB?,ruby-on-rails,ruby,activerecord,yaml,Ruby On Rails,Ruby,Activerecord,Yaml,我正在尝试将一些查找表数据保存到YAML文件中,以便以后需要在其他机器上设置应用程序时,可以将数据作为种子数据加载 数据是类似于选择选项的东西,而且几乎是固定的,所以不用担心实时数据在序列化和反序列化之间的变化 我已经像这样输出了数据 file = File.open("#{RAILS_ROOT}/lib/tasks/questions/questions.yml", 'w') questions = Question.find(:all, :order => 'order_positio

我正在尝试将一些查找表数据保存到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::Object:0x2226b84>

正确的方法是什么?

如果您使用的是Rails 2.3.4或更高版本,则可以在applications db文件夹中找到seeds.rb文件。这允许您定义基本的活动记录创建,当您设置新项目时,您只需调用:

rake db:seed
有一篇关于它的优秀文章,还有一篇关于它的好博客。如果您没有使用Rails 2.3.4或理想情况下的2.3.5,我强烈建议您更新这些很酷的功能,并添加安全/错误修复。

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

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
我能够检索问题列表,如下所示:

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)

被接受的答案真的回答了这个问题吗?看起来询问者想要保存模型,而不仅仅是从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版本是什么?谢谢,是的,这是一个很棒的功能。我想将数据存储在YAML文件中,并使用seeds.rb加载它。有足够的数据,直接在seeds.rb中硬编码模型实例化会很麻烦。seeds.rb只是一个ruby文件。您可以在seeds.rb的内部加载YAML,如这里所述,并在执行Model.create.Man时简单地在数组中循环,了解这一点非常有用。非常感谢。它在Rails 4中仍然相关吗?@Batman我想是的。这依赖于标准YAML解析器和AR数组创建方法。