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

StackOverflow https://stackoverflow.com/questions/62201

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Решение 7

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

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

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

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

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

Другие советы

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

  1. Создайте файл /библиотека/задачи/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 .

Использование 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

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

Для вставки исходных данных я рекомендую вам использовать 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: "test@example.com"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"

Это мое новое любимое решение, использующее populator и faker gems:

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

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

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

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

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

script/console production

...затем ...

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

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

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

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

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

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

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

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

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

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

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

#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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top