Как (и нужно ли) заполнять приложение rails исходными данными
У меня есть приложение rails, где пользователи должны войти в систему. Поэтому для того, чтобы приложение можно было использовать, в системе должен быть один начальный пользователь для первого лица для входа в систему (затем они могут создавать последующих пользователей). До сих пор я использовал миграцию, чтобы добавить специального пользователя в базу данных.
задав этот вопрос, кажется, что я должен использовать db: schema:load, а не запускать миграции, чтобы настроить новые базы данных на новую разработку машины. К сожалению, это, похоже, не включает миграции, которые вставляют данные, только те, которые устанавливают таблицы, ключи и т. д.
мой вопрос в том, как лучше всего справиться с этой ситуацией:
- есть ли способ получить d:s: l для включения миграции вставки данных?
- должен ли я вообще не использовать миграции для вставки данных таким образом?
- должен ли я вообще не заполнять базу данных данными? Должен ли я Обновить код приложения так что он обрабатывает случай, когда нет пользователей изящно, и позволяет создать начальную учетную запись пользователя в реальном времени из приложения?
- какие-то другие варианты? :)
13 ответов:
попробуйте задачу грабли. Например:
- создать файл / lib / tasks / bootstrap.грабли
- в файле добавьте задачу для создания пользователя по умолчанию:
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
- затем, когда вы настраиваете свое приложение в первый раз, вы можете сделать rake db:migrate или rake db:schema:load, а затем сделать Rake bootstrap:all.
использовать
db/seed.rbнайдено в каждом приложении Rails.в то время как некоторые ответы даны выше 2008 может работать хорошо, они довольно устарели, и они на самом деле не рельсы конвенции больше.
заполнение исходных данных в базу данных должно быть сделано с .
это просто работает как файл Ruby.
для того чтобы создать и сохранить объект, вы можете сделать что-то вроде :
User.create(:username => "moot", :description => "king of /b/")после этого файл готов, вы можете сделать следующее
rake db:migrate
rake db:seedили в один шаг
rake db:setupваша база данных должна быть заполнена любыми объектами, которые вы хотите создать в seed.РБ
Я рекомендую вам не вставлять новая данные по миграции. Вместо этого изменяйте только существующие данные при миграции.
для вставки исходных данных, я рекомендую вам использовать YML. В каждом проекте Rails, который я настраиваю, я создаю каталог светильников в каталоге DB. Затем я создаю файлы YML для исходных данных так же, как файлы YML используются для тестовых данных. Затем я добавляю новую задачу для загрузки данных из YML файлы.
lib / tasks / db.рейк:
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'] enddb / светильники / пользователи.yml:
test: customer_id: 1 name: "Test Guy" email: "[email protected]" hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12" salt: "188227600.754087929365988"
попробовать seed-fu плагин, который является довольно простым плагином, который позволяет вам затравить данные(и изменить эти данные в будущем), также позволит вам затравить данные среды и данные для всех сред.
Я думаю, что лучший вариант-номер 3, главным образом потому, что таким образом не будет пользователя по умолчанию, который является отличным способом сделать иначе хорошую безопасность бесполезной.
Я думал, что суммирую некоторые из замечательных ответов, которые у меня были на этот вопрос, вместе с моими собственными мыслями теперь я прочитал их все:)
здесь есть два разных вопроса:
- должен ли я предварительно заполнить базу данных своим специальным пользователем "admin"? Или приложение должно предоставить способ настройки при его первом использовании?
- как можно предварительно заполнить базу данных данными? Обратите внимание, что это корректный вопрос, независимо от ответа на 1 часть: существуют другие сценарии использования для предварительного заполнения, чем пользователь admin.
для (1) кажется, что настройка первого пользователя из самого приложения-это довольно много дополнительной работы, для функциональности, которая по определению почти никогда не используется. Это может быть немного более безопасным, однако, как это заставляет пользователя установить пароль по своему выбору. Лучшее решение находится между этими двумя крайностями: есть скрипт (или задача рейка, или что-то еще) для настройки начального пользователя. Этот затем сценарий можно настроить для автоматического заполнения паролем по умолчанию во время разработки и требовать ввода пароля во время производственной установки/развертывания (если вы хотите запретить ввод пароля по умолчанию для администратора).
для (2), похоже, что существует ряд хороших, допустимых решений. Задача рейка кажется хорошим способом, и есть некоторые плагины, чтобы сделать это еще проще. Просто просмотрите некоторые из других ответов, чтобы увидеть детали этих:)
рассмотрите возможность использования консоли rails. Хорошо подходит для одноразовых задач администрирования, где не стоит пытаться настроить сценарий или миграцию.
на вашей машине продукции:
script/console production... затем...
User.create(:name => "Whoever", :password => "whichever")Если вы создаете этого начального пользователя более одного раза, то вы также можете добавить скрипт в RAILS_ROOT/script/ и запустить его из командной строки на вашей рабочей машине или через задачу capistrano.
отличный пост в блоге об этом: http://railspikes.com/2008/2/1/loading-seed-data
Я использовал предложения Джея о специальном наборе светильников, но быстро обнаружил, что создаю данные, которые невозможно было бы использовать напрямую с помощью моделей (неверсионные записи, когда я использовал acts_as_versioned)
Я бы сохранил его в миграции. Хотя рекомендуется использовать схему для начальных настроек, причина этого заключается в том, что она быстрее, что позволяет избежать проблем. Одна дополнительная миграция для данных должна быть в порядке.
вы также можете добавить данные в файл схемы, так как это тот же формат, что и миграции. Вы просто потеряете функцию автоматического поколения.
для пользователей и групп вопрос о уже существующих пользователях должен определяться с учетом потребностей приложения, а не непредвиденных обстоятельств программирования. Возможно, ваше приложение требует администратора; затем добавить. Или, возможно, нет - затем добавьте код, чтобы изящно запросить настройку пользователя во время запуска приложения.
по более общему вопросу Ясно, что многие приложения Rails могут извлечь выгоду из предварительно заполненной даты. Например, приложение для хранения адресов в США может также содержать все состояния и их сокращения. Для этих случаев миграция - ваш друг, я полагаю.
некоторые ответы устарели. Начиная с 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, которую вы можете использовать после миграции для загрузки данных:
rake db:seedсемя.rb-это классический рубиновый файл, не стесняйтесь использовать любую классическую структуру данных (массив, хэши и т. д.) и итераторы для добавления ваших данных:
["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
Comments