1

私はテーブルを持っており、テーブルで一意性を検証しています。例えば。

テーブルの投稿を作成します (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE, title varchar(255) unique, content text );

ここのタイトルはユニークです。この一意性についてもモデル クラスに通知する必要がありますか? 重複したタイトルを挿入すると、エラーが発生します。どうすればそれをキャッチできますか。現在、レールはバックトレースを表示しており、独自のエラーメッセージを表示できませんでした

def create
  @f = Post.new(params[:post])
  if @f.save
    redirect_to posts_path
  else
    @flash['message'] = "Duplicated title"
    render :action=>'new'
  end 
end 

新しいものにリダイレクトされず、代わりに大きなバックトレースが表示されます。

4

4 に答える 4

2

validates_uniqueness_of検証を使用します。「レコードが作成されると、指定された属性(列にマップされる)に指定された値を持つレコードがデータベースに存在しないことを確認するためのチェックが実行されます」

于 2011-09-23T15:29:05.393 に答える
0

モデルにすべての検証を追加する必要があります。schema_validations と呼ばれる gem があります。これは、検証のためにデータベースを検査し、モデルでそれらを作成します。 https://github.com/lomba/schema_validations

于 2011-09-23T16:23:57.670 に答える
0

Michael Hartl Rails チュートリアルでは、一意性の検証 ("email" フィールドについて) について説明しています。完全な一意性の解決策は次のとおりです。

  1. :uniquenessモデルに検証を追加します。
  2. 移行を使用して、一意のインデックスを DB に追加します。
  3. コントローラーで DB エラーをトラップします。Michael の例はInsoshi people_controller --searchrescue ActiveRecord::StatementInvalidステートメントです。

再。#3、MichaelはDBステートメントの例外でホームページにリダイレクトするだけのように見えるため、@Ransom Briggsが提案する解析ほど複雑ではなく(正確でもありません)、@Omar Qureshiが言うように、それで十分かもしれません、一意性制約はケースの 99% をカバーします。

于 2011-10-15T00:17:19.370 に答える
0

はい、他の回答で述べたように、答えは validate_uniqueness_of - http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086です。モデルに検証があっても、Rails がテーブルに既に一意のレコードがあることを認識せずに 2 つの挿入を試みて実行する競合状態が存在することに注意してください。

レコードが作成されると、指定された属性 (列にマップされる) に指定された値を持つレコードがデータベースに存在しないことを確認するためのチェックが実行されます。レコードが更新されると、同じチェックが行われますが、レコード自体は無視されます。

このチェックはデータベースの外部で実行されるため、2 つの並列トランザクションで重複する値が挿入される可能性があります。これを防ぐには、フィールドに一意のインデックスを作成する必要があります。詳細については、add_index を参照してください。

したがって、データベースに一意のインデックスを作成することで行ったことは正しいですが、例外ログにデータベース ドライバーの例外が記録される場合があります。挿入がいつ発生したかを検出する (ダブルクリックによる) など、これに対する回避策があります。

于 2011-09-23T16:31:53.923 に答える