2011-03-10 69 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