0

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

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

问题是:

  1. 约束异常仅与 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年)

4

1 回答 1

0

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

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

于 2012-08-28T18:18:09.713 回答