Каков наилучший способ заполнения базы данных в Rails?
У меня есть задача rake, которая заполняет некоторые исходные данные в моем приложении rails. Например, в странах, Штатах, операторы мобильной связи и т. д.
Как я его настроил сейчас, у меня есть куча операторов create в файлах в /db/fixtures и задача rake, которая их обрабатывает. Например, одна модель у меня есть темы. У меня есть тема.rb файл в/db / fixtures, который выглядит так:
Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
:component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
:cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
:component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
:join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
:cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
:component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
:cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"
идея здесь заключается в том, что я хочу установить некоторые темы для пользователей, чтобы начать. У меня есть проблема с этим методом.
настройка ID не работает. Это означает, что если я решу добавить тему, назовем ее "красной", то я просто хотел бы добавить оператор темы в этот файл fixture и вызвать задачу rake для повторного заполнения базы данных. Если я это сделаю, потому что темы принадлежат другим объектам и их идентификатор изменяется при этой повторной инициализации, все ссылки нарушаются.
мой вопрос прежде всего, это хороший способ обработки заполнения базы данных? В предыдущий пост, это было рекомендовано мне.
если да, то как я могу жестко закодировать идентификаторы, и есть ли у этого какие-либо недостатки?
если нет, то каков наилучший способ заполнения базы данных?
Я буду по-настоящему ценить длинные и продуманные ответы, которые включают в себя лучшие практики.
8 ответов:
обновление, так как эти ответы немного устарели (хотя некоторые все еще применяются).
простая функция добавлена в rails 2.3.4, db / seeds.РБ
предоставляет новую задачу грабли
rake db:seed
хорошо для заполнения общих статических записей, таких как государства, страны и т. д...
http://railscasts.com/episodes/179-seed-data
*обратите внимание, что вы можете использовать светильники, если вы уже создали их, чтобы также заполнить с db:seed задача, поставив следующее в ваших семенах.RB файл (из эпизода railscast):
require 'active_record/fixtures' Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")
Для Рельсов 3.х использовать и ActiveRecord::светильники' вместо 'постоянные приспособления'
require 'active_record/fixtures' ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")
обычно требуется 2 типа исходных данных.
- основные данные на которые может опираться ядро вашего приложения. Я называю это обычными семенами.
- экологические данные, например, для разработки приложения полезно иметь кучу данных в известном состоянии, которые мы можем использовать для работы над приложением локально (ответ Factory Girl выше охватывает такие данные).
по моему опыту я всегда был сталкиваясь с необходимостью для этих двух типов данных. Так что я собрал небольшой драгоценный камень, который расширяет семена рельсов и позволяет добавлять несколько общих файлов семян в db/ seeds/и любые данные о семенах окружающей среды в db/seeds/ENV, например db/seeds / development.
Я обнаружил, что этого подхода достаточно, чтобы дать моим исходным данным некоторую структуру и дать мне возможность настроить мою среду разработки или промежуточной среды в известном состоянии просто путем работает:
rake db:setup
светильники хрупкие и хлопьевидные для поддержания, как и обычные SQL-дампы.
factory_bot звучит, как он будет делать то, что вы пытаетесь достичь. Можно определить все общие атрибуты в определении по умолчанию, а затем переопределить их во время создания. Вы также можете передать идентификатор на завод:
Factory.define :theme do |t| t.background_color '0x000000' t.title_text_color '0x000000', t.component_theme_color '0x000000' t.carrier_select_color '0x000000' t.label_text_color '0x000000', t.join_upper_gradient '0x000000' t.join_lower_gradient '0x000000' t.join_text_color '0x000000', t.cancel_link_color '0x000000' t.border_color '0x000000' t.carrier_text_color '0x000000' t.public true end Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5') Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5') Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')
при использовании с faker он может заполнить базу данных очень быстро с ассоциациями без необходимости возиться с светильниками (фу).
у меня есть такой код в задаче грабли.
100.times do Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)]) end
используя
seeds.rb
file илиFactoryBot
отлично, но они соответственно отлично подходят для фиксированных структур данных и тестирования.The
seedbank
драгоценный камень может дать вам больше контроля и модульности для ваших семян. Он вставляет грабли задачи, и вы также можете определить зависимости между вашими семенами. Ваш список задач рейка будет иметь следующие дополнения (например):rake db:seed # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env. rake db:seed:bar # Load the seed data from db/seeds/bar.seeds.rb rake db:seed:common # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb. rake db:seed:development # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb. rake db:seed:development:users # Load the seed data from db/seeds/development/users.seeds.rb rake db:seed:foo # Load the seed data from db/seeds/foo.seeds.rb rake db:seed:original # Load the seed data from db/seeds.rb
вместо того, чтобы использовать явное создает, используйте файлы YAML. С помощью простого синтаксиса можно заполнить все значения объекта. На самом деле, если вы знаете что-нибудь о тестировании rails, это стандартный способ заполнения тестовой базы данных. Проверьте эти страницы:
http://railspikes.com/2008/2/1/loading-seed-data http://quotedprintable.com/2007/11/16/seed-data-in-rails
Rails имеет встроенный способ посева данных, как объяснено здесь.
другой способ - использовать драгоценный камень для более продвинутого или легкого посева, такого как:seedbank.
основное преимущество этого драгоценного камня и причина, по которой я его использую, заключается в том, что он имеет расширенные возможности, такие как зависимости загрузки данных и данные семян для каждой среды.
добавление обновленного ответа, поскольку этот ответ был первым в google.