Как (и будет ли) заполнять приложение rails исходными данными

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

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

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

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

Ответ 1

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

Здесь есть два различных вопроса:

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

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

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

Ответ 2

Попробуйте выполнить команду rake. Например:

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

    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: перенести OR rake db: schema: load, а затем сделать rake bootstrap: all.

Ответ 3

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

Для ввода исходных данных я рекомендую использовать YML. В каждом проекте Rails, который я настраиваю, я создаю каталог приборов в каталоге 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"

Ответ 4

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

Ответ 6

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

Ответ 7

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

Ответ 8

Рассмотрите возможность использования консоли рельсов. Хорошо для одноразовых задач администратора, где не стоит пытаться настроить script или перенос.

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

script/console production

... затем...

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

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

Ответ 10

Отличная запись в блоге: http://railspikes.com/2008/2/1/loading-seed-data

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

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

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

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