Вопрос

У меня есть задача 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, чтобы вам никогда не приходилось возиться с явными настройками идентификатора.

Лучше всего использовать светильники.

Примечание:Имейте в виду, что фикстуры выполняют прямые вставки и не используют вашу модель, поэтому, если у вас есть обратные вызовы, заполняющие данные, вам нужно будет найти обходной путь.

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