Как я могу загрузить некоторые модели ActiveRecord из файла YAML и сохранить их в БД? - PullRequest
11 голосов
/ 26 февраля 2010

Я пытаюсь сохранить некоторые данные таблицы поиска в файл YAML, чтобы позже, когда мне нужно настроить приложение на другом компьютере, я мог загрузить данные в качестве начальных данных.

данные подобны опциям выбора, и они в значительной степени установлены, поэтому не стоит беспокоиться об изменении динамических данных между сериализацией и десериализацией.

Я вывел данные, как это ...* И я могу загрузить файл следующим образом ...

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

Однако, когда я пытаюсь сохранить вопрос, я получаю эту ошибку ...

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

Что является правильнымспособ сделать это?

Ответы [ 4 ]

21 голосов
/ 26 февраля 2010

Создайте файл seed.yml в каталоге db. Добавьте документ 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
11 голосов
/ 16 ноября 2011

Действительно ли принятый ответ отвечает на вопрос? Похоже, что запрашивающий хотел сохранить модели, а не просто извлечь их из файла 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}

Он работает и спас мой бекон один или два раза.

9 голосов
/ 27 февраля 2010

Я попробовал ваш сценарий, и у меня не было никаких проблем. Я внес следующие изменения в логику создания файла 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 голос
/ 26 февраля 2010

Если вы используете Rails 2.3.4 (или выше), у них есть файл seeds.rb, который можно найти в папке db вашего приложения. Это позволяет вам определять основные активные записи, и когда вы настраиваете новый проект, вы можете просто позвонить:

rake db:seed

На нем есть Railscast здесь и хороший пост в блоге об этом здесь . Если вы не используете Rails 2.3.4 (или, в идеале, 2.3.5), я настоятельно рекомендую обновить эти классные функции и добавить исправления безопасности / ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...