Я пытаюсь сохранить некоторые данные таблицы поиска в файл 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>
Что корректный путь состоит в том, чтобы сделать это?
Я попробовал ваш сценарий, и у меня не было никаких проблем. Я внес следующие изменения в логику создания файла 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)
Я использую HawkHost для всех своих потребностей в хостинге, и я 90% уверен, что они соответствуют всем вашим критериям. Они предоставляют услуги веб-хостинга и VPS по очень хорошим ценам, а их базовый план веб-хостов также позволяет запускать приложения Rails.
-121--2898862- Используя приведенный ниже код, я смог получить следующие моменты времени относительно согласованно (в течение нескольких мс):
1: 190ms DousContainRev
2: 198 DoesContainRev1
мс
3: 188ms DousContainFwd
4: 203 DoesContainFwd1
мс
5: 199ms Содержит
Несколько вещей, чтобы заметить здесь.
Выполняется с выпуском скомпилированного кода из командной строки. Многие люди ошибаются в тестировании кода в среде отладки Visual Studio, не говоря уже о том, что здесь кто-то сделал, а о чем-то нужно быть осторожным.
Список [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;
}
}
}
Если вы используете Rails 2,3,4 (или выше), у них есть файл seeds.rb
, который можно найти в папке приложений db
. Это позволяет определить основные активные записи создания,и когда вы настроите свой новый проект, вы можете просто позвонить:
rake db:seed
Есть отличный Railscast на нем здесь , и хороший блог об этом здесь . Если вы не используете Rails 2.3.4 (или, в идеале, 2.3.5), я настоятельно рекомендую обновить эти классные функции и добавить средства защиты/исправления ошибок.
Создайте 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