【问题标题】:Rescuing all ConstraintException instead of shutdown拯救所有 ConstraintException 而不是关闭
【发布时间】:2012-08-23 06:37:58
【问题描述】:

我的应用程序遇到了问题:我的数据库有一个限制,其中 trip_id + trip_level_id 必须是唯一的。

现在,这是在数据库级别(无验证),如果我尝试使用 db 中已经存在的那些字段添加一个项目,我会收到一个“约束异常”。

问题是:

  1. constraintexception 仅与 SQlite3 相关,而我对“所有数据库”需要一些东西,特别是我将在生产中使用 mysql,而在开发中使用 sqlite3。
  2. 约束异常后,mongrel 关闭,这绝对不是我想要的。我想向用户发送一条消息“发生约束异常”并且只是不添加该项目,用户需要返回并添加一个正确的项目。

如果可能的话,我如何将所有这些异常转换为 activerecords 应该为我获取的错误(这应该是最好的解决方案)?

否则,如何声明一个验证方法来确保这 2 列的值应该是唯一的?

编辑 1: 我刚刚注意到我无法在 save 方法上拯救 SQLite3::ConstraintException,至少如果我只使用 Exception 类则不会。我想我必须声明一个验证,但如果数据库中已经存在,感觉有点多余。

编辑 2: 这些似乎在谈论问题:https://rails.lighthouseapp.com/projects/8994/tickets/2419-raise-specific-exceptions-for-violated-database-constraints 但是看起来他们没有应用它,但帖子真的很旧(3 年)

【问题讨论】:

    标签: mysql ruby-on-rails activerecord ruby-on-rails-3.1 sqlite


    【解决方案1】:

    阅读后,我发现数据库约束在 activerecord 中实现得不是很好,使用 validates_uniqueness_of 和范围将解决我的问题。

    我绝对不喜欢优化的解决方案,但是我在创建和更新方法中找不到有效挽救异常的方法,所以实际上我是这样解决的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 2023-04-08
      • 2011-06-15
      • 1970-01-01
      • 2012-09-27
      • 2015-02-15
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多