2009-04-17 3 views
68

У меня есть задача rake, которая заполняет некоторые начальные данные в моем приложении rails. Например, страны, штаты, мобильные операторы и т. Д.Каков наилучший способ засевать базу данных в Rails?

Как я уже установил это, есть ли у меня куча операторов создания в файлах в/db/fixtures и задача грабли, которая их обрабатывает. Например, у одной модели есть темы. У меня есть файл theme.rb в/DB/светильниках который выглядит следующим образом:

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», тогда я просто хотел бы добавить оператор темы в этот файл прибора и вызвать задачу rake для повторной загрузки базы данных. Если я это сделаю, потому что темы относятся к другим объектам и изменениям их идентификатора при этой повторной инициализации, все ссылки нарушаются.

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

Если да, то как я могу жестко закодировать идентификаторы, и есть ли какие-то недостатки?

Если нет, то какой наилучший способ засеять базу данных?

Я по-настоящему ценю долгие и продуманные ответы, которые включают лучшие практики.

+0

Не могли бы вы принять более свежий ответ? –

+0

Просто сделал. Спасибо за напоминание – Tony

ответ

99

Обновление, поскольку эти ответы немного устарели (хотя некоторые из них все еще применяются).

Простая функция, добавленная в рельсы 2.3.4, db/seed.гь

Обеспечивает новую передней задачу

rake db:seed 

Хорошо для заполнения общих статических записей, как государства, страна и т.д. ...

http://railscasts.com/episodes/179-seed-data

* Обратите внимание, что вы можете использовать светильники если вы уже создали их, чтобы также заполнить задачу db: seed, поместив следующее в ваш файл seeds.rb (из эпизода railscast):

require 'active_record/fixtures' 
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems") 

Для Rails 3.x использования 'ActiveRecord :: Светильники' вместо '' Светильники постоянной

require 'active_record/fixtures' 
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name") 
2

Вместо использования явных созданий используйте файлы YAML. С помощью простого синтаксиса вы можете заполнить все значения объекта. На самом деле, если вы знаете что-нибудь о тестировании рельсов, это стандартный способ засеять тестовую базу данных. Проверьте эти страницы:
http://railspikes.com/2008/2/1/loading-seed-data http://quotedprintable.com/2007/11/16/seed-data-in-rails

+5

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

-4

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

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

0

Добавьте его в миграцию базы данных, таким образом, каждый получает его по мере обновления. Управляйте всей своей логикой в ​​коде ruby ​​/ rails, поэтому вам никогда не придется возиться с явными настройками идентификатора.

+0

Если мне нужно изменить исходные данные, все может стать беспорядочным при использовании миграций. ваш второй комментарий на самом деле не имеет смысла. ссылки через внешние ключи будут уничтожены – Tony

+0

c = Category.create (stuff) p = Post.create (stuff) p.category = c Не нужно явно указывать ID. Если вы измените исходные данные, вы просто создадите новую миграцию. Довольно легко. –

+0

, который предполагает, что ассоциации могут быть созданы во время создания объекта. вот пример, где я считаю, что ваша логика не срабатывает ... исправьте меня, если я ошибаюсь. Я беру DB в шаблонные темы. user id = 1 создает шаблон id = 2 и с темой id = 4. на данный момент запись находится в db следующим образом: template: id = 2, user_id = 1, theme_id = 4. теперь, если я заново инициализирую db, тема id = 4 теперь является темой id = 10 ... а затем шаблон пользователя неправильно оформлен – Tony

25

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

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 
+10

FactoryGirl фактически предназначен для тестирования вместо а также его можно использовать для загрузки материала в производство. Используйте задачу rake, которая имеет db: migrate как необходимое условие для загрузки всех данных по умолчанию. Возможно, вам понадобится сделать задачу рейка достаточно умной, чтобы она не создайте копии существующих данных. –

+0

Использование FactoryGirl для семени не рекомендуется, [проверить это сообщение] (https://robots.thoughtbot.com/factory_girl-for-seed-data). – blackbiron

24

Обычно существует 2 типа данных семян требуется.

  • Основные данные, на которых ядро ​​вашего приложения может полагаться. Я называю это обычными семенами.
  • Экологические данные, например, для разработки приложения полезно иметь кучу данных в известном состоянии, которые мы можем использовать для работы в приложении локально (ответ Factory Factory на этот тип данных).

По моему опыту, я всегда сталкивался с необходимостью данных этих двух типов. Таким образом, я собрал a small gem that extends Rails' seeds и позволяет добавлять несколько общих файлов семян под db/seed/и любые данные о семян окружающей среды под db/seed/ENV, например db/seed/development.

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

rake db:setup 

Светильников являются хрупкими и странным поведением для поддержания, как и обычные свалки sql.

21

Использование файла seeds.rb или FactoryGirl отлично, но они отлично подходят для фиксированных структур данных и тестирования.

Драгоценный камень 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 
0

Rails имеет встроенный способ Seed данных, как описано here.

Другой способ - использовать драгоценный камень для более продвинутого или легкого посева, такого как: seedbank.

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

Добавление актуального ответа, поскольку этот ответ был первым в google.

Смежные вопросы