2011-03-10 51 views
0

我試圖將兩個模型保存到數據庫。重複輸入錯誤

用戶和董事會。

我在控制器中的以下內容:

if params_posted?(:user) 
       @user = User.new(params[:user].merge :password => generate_random_string) 
       @board = Board.new(params[:board]) 
       @spec = Spec.new(:birthdate => params[:user][:deliver_on]) 
       @user.spec = @spec 
       @pref = Pref.new 
       @board.pref = @pref 
if @board.save & @user.save 
. 
. 
. 
end 

如果信息丟失的董事會仍然得到保存,似乎用戶。該表單顯示正確的錯誤消息,要求用戶更正丟失或無效的信息。

現在,當表單提交一次我得到了以下錯誤:

mysql::Error: Duplicate entry '1000' for key 'PRIMARY': INSERT INTO `boards 

我不想爲要保存的電路板,除非用戶保存記錄。我已閱讀有關交易並嘗試過,但該記錄仍保存。

如何防止發生這種重複?

預先感謝您

+0

顯示您的表單代碼和控制器代碼。看起來你是在手動設置ID – fl00r 2011-03-10 12:08:51

+0

我不是一個Ruby on Rails程序員,但是,一般來說,你不能保存用戶,確保沒有失敗(檢查錯誤或你有什麼)然後保存電路板? – 2011-03-10 12:10:49

+0

是的,它是fl00r。我運行代碼來比較幾秒鐘內保存的電路板以捕獲多次提交的表單。所以我設置了id來匹配剛剛保存的板子。 – chell 2011-03-10 12:42:24

回答

0

所以,你必須先保存用戶,那麼主板對象。並使用代表邏輯與的&&運算符。

if @user.save && @board.save 
    ... 
end 
+0

謝謝Greg。我只是試過,但它仍然是一樣的。我需要一些事務來確保兩個記錄同時保存。任何想法我可以做到這一點? – chell 2011-03-10 12:24:20

+0

您可以(a)添加事務塊'User.transaction do ... end'或者(b)檢查兩個記錄在保存之前是否有效if if user.valid? && @ board.valid? ...'。但請記住,如果一條記錄未保存或使用引發異常的'save!'方法,則回滾事務。 – 2011-03-10 12:54:18

+0

感謝格雷格我會接下來看看會發生什麼。我感謝你的建議。 – chell 2011-03-11 01:57:25