Как (и нужно ли) заполнять приложение рельсов исходными данными - PullRequest
61 голосов
/ 15 сентября 2008

У меня есть приложение rails, в котором пользователи должны войти в систему. Поэтому для того, чтобы приложение можно было использовать, в системе должен быть один начальный пользователь, чтобы первый пользователь мог войти в систему (затем они могут создать последующие пользователей). До сих пор я использовал миграцию для добавления специального пользователя в базу данных.

Задав этот вопрос , мне кажется, что я должен использовать db: schema: load, а не запускать миграции, для установки новых баз данных на новых машинах разработки. К сожалению, это не относится к миграциям, которые вставляют данные, только к тем, которые устанавливают таблицы, ключи и т. Д.

Мой вопрос: как лучше всего справиться с этой ситуацией:

  1. Есть ли способ получить d: s: l для включения миграций с вставкой данных?
  2. Должен ли я вообще не использовать миграции для вставки данных?
  3. Не следует ли мне вообще предварительно заполнять базу данных данными? Должен ли я обновить код приложения, чтобы он обрабатывал случай, когда нет изящных пользователей, и позволял создавать первоначальную учетную запись пользователя вживую из приложения?
  4. Есть ли другие варианты? :)

Ответы [ 13 ]

46 голосов
/ 15 сентября 2008

Попробуйте задание на грабли. Например:

  1. Создать файл / lib / tasks / bootstrap.rake
  2. В файле добавьте задачу для создания пользователя по умолчанию:

    namespace :bootstrap do
      desc "Add the default user"
      task :default_user => :environment do
        User.create( :name => 'default', :password => 'password' )
      end

      desc "Create the default comment"
      task :default_comment => :environment do
        Comment.create( :title => 'Title', :body => 'First post!' )
      end

      desc "Run all bootstrapping tasks"
      task :all => [:default_user, :default_comment]
    end
  1. Затем, когда вы настраиваете приложение в первый раз, вы можете выполнить rake db: migrate ИЛИ rake db: schema: load, а затем выполнить rake bootstrap: all.
34 голосов
/ 14 февраля 2013

Использовать db/seed.rb в каждом приложении Rails.

Хотя некоторые ответы, приведенные выше от 2008 , могут хорошо работать, они довольно устарели и больше не являются соглашением Rails.

Заполнение исходных данных в базе данных должно выполняться с помощью файла db/seed.rb.

Это просто работает как файл Ruby.

Чтобы создать и сохранить объект, вы можете сделать что-то вроде:

User.create(:username => "moot", :description => "king of /b/")

Как только у вас будет готов этот файл, вы можете выполнить следующие действия:

rake db:migrate

rake db:seed

или за один шаг

rake db:setup

Ваша база данных должна быть заполнена теми объектами, которые вы хотите создать в seed.rb

32 голосов
/ 15 сентября 2008

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

Для вставки исходных данных я рекомендую использовать YML. В каждом проекте Rails, который я настраиваю, я создаю каталог fixtures в каталоге DB. Затем я создаю YML-файлы для исходных данных так же, как YML-файлы используются для тестовых данных. Затем я добавляю новую задачу для загрузки данных из файлов YML.

Lib / задачи / db.rake:

namespace :db do
  desc "This loads the development data."
  task :seed => :environment do
    require 'active_record/fixtures'
    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
      base_name = File.basename(file, '.*')
      say "Loading #{base_name}..."
      Fixtures.create_fixtures('db/fixtures', base_name)
    end
  end

  desc "This drops the db, builds the db, and seeds the data."
  task :reseed => [:environment, 'db:reset', 'db:seed']
end

дб / приборы / users.yml:

test:
  customer_id: 1
  name: "Test Guy"
  email: "test@example.com"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"
9 голосов
/ 16 сентября 2008

Это мое новое любимое решение, использующее гемы популатора и фейера:

http://railscasts.com/episodes/126-populating-a-database

6 голосов
/ 16 сентября 2008

Попробуйте плагин seed-fu , который является довольно простым плагином, который позволяет вам загружать данные (и изменять эти исходные данные в будущем), также позволит вам загружать данные, специфичные для окружающей среды, и данные для все среды.

4 голосов
/ 16 сентября 2008

Я думал, что суммирую некоторые из замечательных ответов, которые у меня были на этот вопрос, вместе со своими мыслями, теперь я прочитал их все:)

Здесь есть две разные проблемы:

  1. Должен ли я предварительно заполнить базу данных моим специальным пользователем 'admin'? Или приложение должно предоставить способ настройки при первом использовании?
  2. Как можно предварительно заполнить базу данных данными? Обратите внимание, что это правильный вопрос, независимо от ответа на часть 1: существуют другие сценарии использования для предварительного заполнения, кроме администратора.

Для (1) кажется, что настройка первого пользователя из самого приложения - это совсем немного дополнительной работы, для функциональности, которая по определению практически не используется. Однако он может быть немного более безопасным, поскольку заставляет пользователя устанавливать пароль по своему выбору. Лучшее решение находится между этими двумя крайностями: иметь сценарий (или задачу rake, или что-то еще), чтобы настроить первоначального пользователя. Затем сценарий можно настроить на автоматическое заполнение паролем по умолчанию во время разработки и требовать ввода пароля во время производственной установки / развертывания (если вы хотите не использовать пароль по умолчанию для администратора).

Для (2), по-видимому, существует ряд хороших, правильных решений. Грабельное задание кажется хорошим способом, и есть несколько плагинов, чтобы сделать это еще проще. Просто просмотрите некоторые другие ответы, чтобы увидеть их подробности:)

4 голосов
/ 15 сентября 2008

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

3 голосов
/ 10 сентября 2010

Отличное сообщение в блоге об этом: http://railspikes.com/2008/2/1/loading-seed-data

Я использовал предложения Джея о специальном наборе приборов, но быстро обнаружил, что создаю данные, которые были бы невозможны при использовании моделей напрямую (неверсионные записи, когда я использовал act_as_versioned)

3 голосов
/ 16 сентября 2008

Эта задача Rake может быть предоставлена ​​плагином db-populate:

http://github.com/joshknowles/db-populate/tree/master

3 голосов
/ 15 сентября 2008

Рассмотрите возможность использования консоли rails. Подходит для одноразовых задач администратора, где не стоит усилий для настройки скрипта или миграции.

На вашей производственной машине:

script/console production

... тогда ...

User.create(:name => "Whoever", :password => "whichever")

Если вы генерируете этого первоначального пользователя более одного раза, вы также можете добавить скрипт в RAILS_ROOT / script / и запустить его из командной строки на рабочем компьютере или с помощью задачи capistrano.

...