抢救所有ConstraintException而不是shutdown

时间:2012-08-28 17:39:10

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

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

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

问题是:

  1. 这种约束只与SQlite3相关,而我需要“全部数据库”的东西,特别是我在生产中使用mysql而在开发中使用sqlite3。
  2. 在约束异常之后,mongrel关闭,这绝对不是我想要的。我想向用户发送消息“发生约束异常”,只是不添加项目,用户需要返回并添加正确的项目。
  3. 如果可能的话,我怎样才能将所有这些异常转换为activerecords应该为我提取的错误(这应该是最好的解决方案)?

    否则,如何声明一个验证方法,确保对于这两列,value应该是唯一的?

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

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

1 个答案:

答案 0 :(得分:0)

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

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