【问题标题】:Duplicate entry error重复输入错误
【发布时间】:2011-03-10 12:04:00
【问题描述】:

我正在尝试将两个模型保存到数据库中。

用户和董事会。

我在控制器中执行以下操作:

 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

除非用户被保存,否则我不希望保存板的记录。我已阅读有关交易的信息并尝试过,但记录仍然保存。

我怎样才能阻止这种重复发生?

提前谢谢你

【问题讨论】:

  • 显示您的表单代码和控制器代码。看起来您正在将 id 设置为手动登机
  • 我不是 Ruby-on-Rails 程序员,但一般来说,你能不能不保存用户,确保没有失败(检查错误或你有什么)然后保存董事会?
  • 是的,就是 fl00r。我运行代码来比较在这么多秒内保存的板,以捕获多次提交的表单。所以我将 id 设置为与刚刚保存的板相匹配。

标签: mysql ruby-on-rails duplicates


【解决方案1】:

所以你必须先保存用户,然后是棋盘对象。并使用代表逻辑与的&& 运算符。

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

【讨论】:

  • 谢谢格雷格。我只是尝试过,但它仍然做同样的事情。我需要诸如事务之类的东西来确保同时保存两条记录。有什么想法可以做到吗?
  • 您可以 (a) 添加交易块 User.transaction do ... end 或 (b) 在保存之前检查两条记录是否有效 if @user.valid? && @board.valid? ...。但是如果没有保存一条记录,请记住回滚事务或使用引发异常的save!方法。
  • 谢谢 Greg 我会继续下去看看会发生什么。感谢您的建议。
猜你喜欢
  • 2018-04-19
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2015-06-18
相关资源
最近更新 更多