Подтвердить что ты не робот

Как загрузить некоторые модели ActiveRecord из файла YAML и сохранить их в БД?

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

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

У меня есть данные, подобные этому...

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

И я могу загрузить файл следующим образом:

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

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

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

Каков правильный способ сделать это?

4b9b3361

Ответ 1

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

Ответ 2

Создайте файл 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

Ответ 3

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

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

Ответ 4

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

rake db:seed

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