2009-02-20 3 views
3

В приложении Rails мне нужна таблица в моей базе данных для хранения постоянных данных.Заполнение таблицы с постоянными значениями

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

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

Есть ли способ правильно заполнить эту базу данных даже в тестовой среде? Есть ли другой способ обработки таких данных, которые не должны быть в коде?

редактировать

Спасибо всем за ваши ответы и особенно Влад R для объяснения проблемы.

Теперь я понимаю, почему мои данные не загружены в тест. Это связано с тем, что тестовая среда использует команду rake db:load, которая непосредственно загружает схему вместо запуска миграции. Поставив мои значения только в миграцию, а не в схему, эти значения не загружаются для теста.

ответ

3

Возможно, вы наблюдаете за тем, что тестовая среда не выполняет миграции (db: migrate), но вместо этого загружает db/schema.rb (db: load).

У вас есть два варианта:

  1. продолжают использовать миграцию для производства и развития; для тестовой среды добавьте свои постоянные данные в соответствующие файлы yml в db/fixtures.
  2. оставить существующие файлы db/fixtures нетронутыми и создать другой набор файлов yml (содержащий постоянные данные) в том же духе, что и db/светильники, но пригодные для использования на обоих испытаний и производства/сред разработки при выполнении грабли БД: нагрузки инициализации схемы

Для покрытия этих сценариев, которые используют БД: нагрузки (вместо БД: мигрировать - например, тест, в результате чего на новый база данных на новой машине разработки, использующая более быструю db: load вместо db: migrate и т. д.), создает в RAILS_APP/lib/задачи drop-in rakefile, чтобы увеличить задачу db: load, загрузив ваши данные постоянной инициализации из «seed» «yml-файлы (по одному для каждой модели) в базу данных.

В качестве примера воспользуйтесь командой db: seed rake. Поместите ваши данные семян в дб/семенах/.yml

#the command is: rake:db:load 
namespace :db do 
    desc 'Initialize data from YAML.' 
    task :load => :environment do 
    require 'active_record/fixtures' 
    Dir.glob(RAILS_ROOT + '/db/seeds/*.yml').each do |file| 
     Fixtures.create_fixtures('db/seeds', File.basename(file, '.*')) 
    end 
    end 
end 

Для покрытия дополнительных сценариев (БД: мигрировать), определить один миграцию, которая делает то же самое, что и задачи, определенные выше.

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

2

Взгляните на мою статью по адресу loading seed data.

Существует несколько способов сделать это. Мне нравится задача rake под названием db:populate, которая позволяет вам указывать фиксированные данные в обычных операциях создания ActiveRecord.Для получения данных в тестах я просто загружаю этот заполняемый файл в свой test_helper. Тем не менее, я думаю, что я собираюсь перейти на тестовую базу данных, в которой уже есть данные о семени.

Существует также плагин под названием SeedFu, который помогает с этой проблемой.

Независимо от того, что вы делаете, я рекомендую не использовать светильники для этого, потому что они не подтверждают ваши данные, поэтому очень легко создать недопустимые записи.

Смежные вопросы