it-swarm-ru.tech

Как (и нужно ли) заполнять Rails приложение начальными данными

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

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

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

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

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

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

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

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

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

4
Luke Halliwell

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

  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 OR rake db: schema: load, а затем выполнить rake bootstrap: all.
46
Aaron Wheeler

Используйте 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

34
Jason Kim

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

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

Библиотека/Задачи/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: "[email protected]"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"
32
Jay Stramel

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

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

9
Mark Richman

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

6
DEfusion

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

4
Vinko Vrsalovic

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

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

script/console production

... затем ...

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

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

3
Trevor Stow

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

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

3
Kevin Davis

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

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

3
pantulis

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

Что касается более общего вопроса, ясно, что многие Rails приложения могут извлечь выгоду из предварительно заполненной даты. Например, заявка на хранение адреса в США также может содержать все штаты и их сокращения. В этих случаях миграция - ваш друг, я считаю.

2
NickR

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

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

2
MattW.

Некоторые ответы устарели. Поскольку Rails 2.3.4, в db/seed.rb доступна простая функция Seed:

#db/seed.rb
User.create( :name => 'default', :password => 'password' )
Comment.create( :title => 'Title', :body => 'First post!' )

Он предоставляет новую задачу rake, которую вы можете использовать после миграции для загрузки данных:

rake db:seed

Seed.rb - это классический Ruby файл, вы можете использовать любую классическую структуру данных (массив, хэши и т.д.) И итераторы для добавления ваших данных:

["bryan", "bill", "tom"].each do |name|
  User.create(:name => name, :password => "password")
end

Если вы хотите добавить данные с символами UTF-8 (очень часто встречаются на французском, испанском, немецком и т.д.), Не забудьте добавить в начале файла:

# Ruby encoding: utf-8

Этот Railscast является хорошим введением: http://railscasts.com/episodes/179-seed-data

1
frenci