2009-04-17 148 views
68

我有一個rake任務,填充我的rails應用程序中的一些初始數據。例如,國家,州,移動運營商等在Rails中建立數據庫的最佳方式是什麼?

我現在設置的方式是,我有一堆創建語句在/ db /夾具文件和一個耙子任務處理它們。例如,我擁有的一個模型是主題。我在/ DB /夾具一個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不起作用。這意味着如果我決定添加一個主題,我們將其稱爲'Red',那麼我只想將主題語句添加到該夾具文件並調用rake任務來重新設置數據庫。如果我這樣做,因爲主題屬於其他對象,並且在重新初始化時它們的ID發生了變化,所有鏈接都被打破。

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

如果是這樣,我該如何硬編碼ID,並有什麼缺點呢?

如果不是,種子數據庫的最佳方法是什麼?

我真的很感激長期以來想出的結合最佳實踐的答案。

+0

你能接受更新的答案嗎? – 2011-02-24 20:03:38

+0

剛剛做到了。感謝提醒 – Tony 2011-03-01 15:33:17

回答

99

正在更新,因爲這些答案略有過時(儘管有些仍然適用)。

在rails 2.3.4,db/seeds中添加的簡單功能。RB

提供了一個新的rake任務

rake db:seed 

適合填充普通的靜態記錄,如州,國家等等

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

*需要注意的是,你可以,如果你使用的燈具已經創建它們以通過將以下內容放入您的seeds.rb文件(來自railscast情節)來填充db:seed任務:

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

對於滑軌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 2009-04-17 17:39:12

-4

最好的辦法是使用燈具。

注意:請記住,燈具做直接插入,不使用你的模型,所以如果你有回調填充數據,你需要找到一個解決方法。

0

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

+0

如果我需要更改初始數據,使用遷移時可能會變得雜亂無章。你的第二個評論沒有意義。通過外鍵鏈接將被銷燬 – Tony 2009-04-17 20:15:04

25

factory_girl聽起來像它會做你正在努力實現的。您可以在默認定義中定義所有常用屬性,然後在創建時覆蓋它們。您也可以通過一個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') 

當騙子用它可以確實很快與各協會填充數據庫,而無需做手腳配件(呸)。

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

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

通常有需要2種類型的種子數據。

  • 基本數據根據您的應用程序的核心可能依賴。我把這稱爲共同的種子。
  • 環境數據,例如爲了開發應用程序,我們可以在本地處理應用程序時使用一堆已知狀態的數據(上面的Factory Girl答案涵蓋了此類數據)。

根據我的經驗,我總是遇到需要這兩種類型的數據。所以我放在一起a small gem that extends Rails' seeds,並讓你添加db/seeds /下的多個常見種子文件和db/seeds/ENV下的任何環境種子數據,例如db/seeds/development。

我發現這種方法足以讓我的種子數據的一些結構,給我力量,建立我在已知狀態下開發或臨時環境只是通過運行:

rake db:setup 

賽程是脆弱的,古怪像常規的sql轉儲那樣維護。

21

使用seeds.rb文件或FactoryGirl是偉大的,但它們分別適用於固定數據結構和測試。

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 
0

的Rails有一個內置的方式解釋here種子數據。

另一種方法是將寶石用於更高級或易於播種,例如:seedbank

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

添加一個最新的答案,因爲這個答案是第一次在谷歌。

相關問題