2013-02-18 88 views
0

我正在使用rake任務來使用一些初始數據填充我的數據庫。我想在表格中創建一堆條目,並且前幾個ID,所以它們始終存在,並始終具有這些ID。我不介意在開發環境中有人添加/刪除/修改記錄,但我總是希望前5個ID具有值。這裏是我的lib /任務/ bootstrap.rb文件的簡化版本:當ID已經存在時創建失敗

namespace :bootstrap do 
    desc "Create the default problem types" 
    task :default_problem_types => :environment do 
     ProblemType.create(:id => 1, :name => 'Wrong location', :description => 'blah') 
     ProblemType.create(:id => 2, :name => 'Wrong name', :description => 'blah') 
     ProblemType.create(:id => 3, :name => 'Wrong details', :description => 'blah') 
     ProblemType.create(:id => 4, :name => 'Duplicate', :description => 'blah') 
     ProblemType.create(:id => 5, :name => 'No longer exists', :description => 'blah') 
    end 

    desc "Run all bootstrapping tasks" 
    task :all => [:default_problem_types] 
end 

能正常工作的空數據庫。它創建於problem_types表5個新條目:

1 - Wrong Location 
2 - Wrong name 
3 - Wrong details 
4 - Duplicate 
5 - No longer exists 

的問題是,如果我運行它第二次,它會創建5分新的記錄,使用標識6,7,8,9,10,這就是儘管事實上,我向已經存在的create()調用提供了id。我期待這些呼叫失敗,因爲如果我嘗試做以下SQL:

insert into problem_types (id, name, description) values (1, 'foo', 'bar'); 

...失敗:

ERROR 1062(23000):對於重複鍵輸入'1' PRIMARY'

如果ID已經存在,如何獲取create()方法失敗?

謝謝。

+1

你爲什麼使用rake任務而不是種子?使用種子,如果你正確地清理你的數據庫,你總是可以有1-5的id。 – 2013-02-18 21:00:30

+0

我正在使用rake任務,因爲我遇到了另一個推薦的帖子,而我對種子並不熟悉。但是,在閱讀您的評論之後,我查了一下種子,並認爲種子更合適。 – antun 2013-02-19 22:10:04

+0

我正在切換到種子,但是當我執行ProblemType.delete_all時,然後重新創建它們(使用ProblemType.find_or_initialize_by_name()),ID不會從1-5開始;他們不斷增加。 (我在本地使用mySQL)。是否有另一種方法來正確清理數據庫? – antun 2013-02-26 03:40:27

回答

0

使用動態find_or_create_byfind_or_initialize_by方法記錄將不會被創建。您可以在Rails guides for the Active Record query interface中閱讀更多關於這些內容的內容。他們讓你寫這樣的事情每個ProblemType沒有按名稱創建重複:

problem_type = ProblemType.find_or_initialize_by_name('Wrong location') 
problem_type.description = "blah" 
problem_type.save 

我同意@benchwarmer;最好避免自己管理主鍵。如果您必須具有某種語義值的數字標識符,請嘗試添加單獨的列並相應地設置該值。

+0

find_or_initialize_by_name方法適用於我。謝謝! – antun 2013-02-19 22:12:02

0

經驗法則:你不要自己分配ID。讓數據庫完成它的工作。如果你想你的問題的名字是唯一的,那麼你可以添加到validates_uniqueness_of :name模型文件,如果存在同名

+0

是的,我不關心ID爲1-5,因爲我沒有重複。 @ rossta關於使用名稱(find_or_initialize_by_name)的建議訣竅。 – antun 2013-02-19 22:13:24

相關問題