Заполните таблицу постоянных значений - PullRequest
3 голосов
/ 20 февраля 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 20 февраля 2009

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

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

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

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

В качестве примера используйте задание db: seed rake. Поместите данные вашего семени в db / seed / .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

Чтобы охватить инкрементные сценарии (db: migrate), определите одну миграцию, которая выполняет те же действия, что и описанная выше задача.

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

2 голосов
/ 20 февраля 2009

Взгляните на мою статью о загрузке начальных данных .

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

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

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

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