Каков наилучший способ создать базу данных в Rails?
-
11-09-2019 - |
Вопрос
У меня есть задача rake, которая заполняет некоторые исходные данные в моем приложении rails.Например, страны, штаты, операторы мобильной связи и т.д.
То, как я это настроил сейчас, заключается в том, что у меня есть куча инструкций create в файлах в /db / fixtures и задача rake, которая их обрабатывает.Например, одна из моделей, которая у меня есть, - это темы.У меня есть файл theme.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"
Идея здесь в том, что я хочу установить несколько стандартных тем для пользователей для начала.У меня проблема с этим методом.
Установка идентификатора не работает.Это означает, что если я решу добавить тему, назовем ее "Red", то я просто хотел бы добавить инструкцию theme в этот файл fixture и вызвать задачу rake для повторного заполнения базы данных.Если я это сделаю, поскольку темы принадлежат другим объектам и их идентификаторы меняются при этой повторной инициализации, все ссылки будут разорваны.
Мой вопрос, прежде всего, в том, является ли это хорошим способом обработки заполнения базы данных?В предыдущем посте мне это было рекомендовано.
Если да, то как я могу жестко закодировать идентификаторы и есть ли в этом какие-либо недостатки?
Если нет, то каков наилучший способ заполнить базу данных?
Я буду искренне признателен за длинные и продуманные ответы, которые включают в себя лучшие практики.
Решение
Обновление, поскольку эти ответы немного устарели (хотя некоторые из них все еще применяются).
Простая функция, добавленная в рельсы 2.3.4, db/seeds.rb
Предоставляет новую задачу рейка
rake db:seed
Хорошо подходит для заполнения общих статических записей, таких как штаты, страны и т. д.
http://railscasts.com/episodes/179-seed-data
*Обратите внимание, что вы можете использовать фикстуры, если вы их уже создали, чтобы также заполнить их задачей db:seed, поместив следующее в файл семенного материала (из эпизода с Railscast):
require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")
Для Rails 3.x используйте ActiveRecord::Fixtures вместо константы Fixtures.
require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")
Другие советы
Обычно требуется 2 типа исходных данных.
- Основные данные на которые может опираться ядро вашего приложения.Я называю это обычными семенами.
- Экологические данные, например, для разработки приложения полезно иметь набор данных в известном состоянии, которые мы можем использовать для локальной работы над приложением (приведенный выше ответ Factory Girl охватывает такого рода данные).
По своему опыту я всегда сталкивался с необходимостью в этих двух типах данных.Итак, я собрал воедино маленький драгоценный камень, который расширяет семена Rails и позволяет добавлять несколько общих исходных файлов в db/seeds / и любые исходные данные среды в db /seeds / ENV, например db /seeds /development.
Я обнаружил, что этого подхода достаточно, чтобы придать моим исходным данным некоторую структуру, и он дает мне возможность настроить мою среду разработки или промежуточную среду в известном состоянии, просто запустив:
rake db:setup
Приспособления хрупки и ненадежны в обслуживании, как и обычные sql-дампы.
фабрика_бот похоже, он сделает то, чего вы пытаетесь достичь.Вы можете определить все общие атрибуты в определении по умолчанию, а затем переопределить их во время создания.Вы также можете передать идентификатор фабрике:
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 он может очень быстро заполнить базу данных ассоциациями без необходимости возиться с Fixtures (фу).
У меня есть такой код в задаче rake.
100.times do
Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end
С использованием seeds.rb
файл или FactoryBot
это здорово, но они, соответственно, отлично подходят для фиксированных структур данных и тестирования.
А seedbank
драгоценный камень может дать вам больше контроля и модульности для ваших семян.Он вставляет rake-задачи, и вы также можете определять зависимости между вашими семенами.В ваш список задач по рейку войдут следующие дополнения (например):
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
В Rails есть встроенный способ заполнения данных, как описано. здесь.
Другой способ — использовать драгоценный камень для более сложного или простого посева, например: банк семян.
Основное преимущество этого драгоценного камня и причина, по которой я его использую, заключается в том, что он обладает расширенными возможностями, такими как зависимости загрузки данных и начальные данные для каждой среды.
Добавление актуального ответа, поскольку этот ответ был первым в Google.
Добавьте его при миграции базы данных, чтобы каждый получал его по мере обновления.Обрабатывайте всю свою логику в коде Ruby/rails, чтобы вам никогда не приходилось возиться с явными настройками идентификатора.
Лучше всего использовать светильники.
Примечание:Имейте в виду, что фикстуры выполняют прямые вставки и не используют вашу модель, поэтому, если у вас есть обратные вызовы, заполняющие данные, вам нужно будет найти обходной путь.