簡體   English   中英

在Rails中為數據庫設定種子的最佳方法是什么?

[英]What is the best way to seed a database in Rails?

我有一個rake任務,在我的rails應用程序中填充一些初始數據。 例如,國家,州,移動運營商等

我現在設置它的方式是,我在/ db / fixtures中的文件中有一堆create語句,還有一個處理它們的rake任務。 例如,我有一個模型是主題。 我在/ db / fixtures中有一個theme.rb文件,如下所示:

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任務來重新設置數據庫。 如果我這樣做,因為主題屬於其他對象,並且在重新初始化時它們的id發生了變化,所有鏈接都會被破壞。

我的問題首先是,這是處理數據庫播種的好方法嗎? 在之前的帖子中,我向你推薦了這個。

如果是這樣,我怎么能對ID進行硬編碼,這有什么缺點嗎?

如果沒有,那么種子數據庫的最佳方法是什么?

我將真正感謝包含最佳實踐的長期和深思熟慮的答案。

更新,因為這些答案有點過時(雖然有些仍然適用)。

在rails 2.3.4,db / seeds.rb中添加了簡單的功能

提供新的rake任務

rake db:seed

適合填充州,國家等常見靜態記錄...

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

*請注意,如果您已經創建了fixtures,則可以使用fixture來填充db:seed任務,方法是將以下內容放入seeds.rb文件中(來自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轉儲一樣,Fixtures易於維護和維護。

factory_bot聽起來像它會做你想要實現的。 您可以在默認定義中定義所有公共屬性,然后在創建時覆蓋它們。 您也可以將ID傳遞給工廠:

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(yuck)。

我在rake任務中有這樣的代碼。

100.times do
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end

使用seeds.rb文件或FactoryBot非常棒,但它們分別適用於固定數據結構和測試。

seedbank寶石可能會為您的seedbank提供更多控制和模塊化。 它插入rake任務,您還可以定義種子之間的依賴關系。 您的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

軌道有一個內置的方式解釋種子數據在這里

另一種方法是使用寶石進行更高級或更容易的播種,例如: 種子庫

這個gem的主要優點和我使用它的原因是它具有高級功能,如數據加載依賴項和每個環境種子數據。

添加最新答案,因為此答案首先在谷歌上。

最好的方法是使用燈具。

注意:請記住,燈具會直接插入並且不使用您的模型,因此如果您有填充數據的回調,則需要找到解決方法。

將其添加到數據庫遷移中,這樣每個人都可以在更新時獲取它。 處理ruby / rails代碼中的所有邏輯,因此您永遠不必弄亂顯式ID設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM