0

アプリケーションで問題が発生しています。データベースには、trip_id + trip_level_id が一意でなければならないという制約があります。

現在、これはデータベース レベル (検証なし) です。これらのフィールドが既に db に存在するアイテムを追加しようとすると、「constraintexception」が表示されます。

問題は:

  1. 制約の例外は SQlite3 にのみ関連していますが、「すべてのデータベース」に何かを必要とします。特に、開発では sqlite3 を使用し、本番環境では mysql を使用します。
  2. 制約例外の後、mongrel がシャットダウンされました。これは、私が望んでいるものではありません。ユーザーに「制約例外が発生しました」というメッセージを送信したいのですが、アイテムを追加しないでください。ユーザーは戻って正しいアイテムを追加する必要があります。

可能であれば、これらすべての例外を、activerecords がフェッチするエラーに変換するにはどうすればよいですか (これが最大の解決策になるはずです)。

それ以外の場合、これらの 2 つの列の値が一意であることを保証する検証メソッドを宣言する方法は?

編集 1:少なくとも Exception クラスだけを使用している場合は、save メソッドで SQLite3::ConstraintException をレスキューできないことに気付きました。検証を宣言する必要があると思いますが、データベースに既に存在する場合は少し冗長に感じます。

編集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 に答える