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

Я пытаюсь сохранить некоторые данные таблицы поиска в файл 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>

Что корректный путь состоит в том, чтобы сделать это?

12
задан Ethan 26 February 2010 в 01:54
поделиться

3 ответа

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

Я использую HawkHost для всех своих потребностей в хостинге, и я 90% уверен, что они соответствуют всем вашим критериям. Они предоставляют услуги веб-хостинга и VPS по очень хорошим ценам, а их базовый план веб-хостов также позволяет запускать приложения Rails.

-121--2898862-

Используя приведенный ниже код, я смог получить следующие моменты времени относительно согласованно (в течение нескольких мс):
1: 190ms DousContainRev
2: 198 DoesContainRev1
мс 3: 188ms DousContainFwd
4: 203 DoesContainFwd1
мс 5: 199ms Содержит

Несколько вещей, чтобы заметить здесь.

  1. Выполняется с выпуском скомпилированного кода из командной строки. Многие люди ошибаются в тестировании кода в среде отладки Visual Studio, не говоря уже о том, что здесь кто-то сделал, а о чем-то нужно быть осторожным.

  2. Список [i] .Equals (элемент) выглядит немного медленнее, чем element.Equals (список [i]) .

     с использованием системы;
    с помощью System.Diagnostics;
    использование System.Collections;
    
    
    пространство имен ArrayListBenchmark
    {
    Классовая программа
    {
    static void Main (последовательность [] args)
    {
    Секундомер sw = новый секундомер ();
    contst int arrayCount = 10000000;
    Перечислять = новый ArrayList (arrayCount);
    для (int i = 0; i < arrayCount; i++) список. Добавить («zzz» + i);
    sw. Пуск ();
    DousContainRev (список, «zzz»);
    sw. Стоп;
    Console.WriteLine Последовательности .Format («1: {0}», sw. ElapsedMilliseconds));
    sw. Сброс ();
    
    sw. Пуск ();
    DoesContainRev1 (список, «zzz»);
    sw. Стоп;
    Console.WriteLine Последовательности .Format («2: {0}», sw. ElapsedMilliseconds));
    sw. Сброс ();
    
    sw. Пуск ();
    DousContainFwd (список, «zzz»);
    sw. Стоп;
    Console.WriteLine Последовательности .Format («3: {0}», sw. ElapsedMilliseconds));
    sw. Сброс ();
    
    sw. Пуск ();
    DoesContainFwd1 (список, «zzz»);
    sw. Стоп;
    Console.WriteLine Последовательности .Format («4: {0}», sw. ElapsedMilliseconds));
    sw. Сброс ();
    
    sw. Пуск ();
    список. Содержит («zzz»);
    sw. Стоп;
    Console.WriteLine Последовательности .Format («5: {0}», sw. ElapsedMilliseconds));
    sw. Сброс ();
    
    Пульт. ReadKey ();
    }
    public static bool DousContainRev (список ArrayList, элемент объекта)
    {
    int count = список. Считать;
    для (int i = count - 1; i > = 0; i--)
    если (element.Equals (list [i])) возвращает значение true;
    
    возвращает значение false;
    }
    public static bool DousContainFwd (список ArrayList, элемент объекта)
    {
    int count = список. Считать;
    для (int i = 0; i < count; i++)
    если (element.Equals (list [i])) возвращает значение true;
    
    возвращает значение false;
    }
    public static bool DoesContainRev1 (список ArrayList, элемент объекта)
    {
    int count = список. Считать;
    для (int i = count - 1; i > = 0; i--)
    if (list [i] .Equals (элемент)) возвращает значение true;
    
    возвращает значение false;
    }
    public static bool DoesContainFwd1 (список ArrayList, элемент объекта)
    {
    int count = список. Считать;
    для (int i = 0; i < count; i++)
    if (list [i] .Equals (элемент)) возвращает значение true;
    
    возвращает значение false;
    }
    }
    }
    
-121--4132561-

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

rake db:seed

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

1
ответ дан 2 December 2019 в 03:28
поделиться

Создайте 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
21
ответ дан 2 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: