2011-01-05 8 views
0

コードが一意であることを保証する最良の方法は何ですか?コードはXXX-XXXXXです(Xは数字のみです)。Rails 3:ユニークなコードの比較

データベーステーブル内のコードを検索する以外に、処理を高速かつクリーンにする方法はありますか?

よろしくお願いいたします。

+0

どのような堅牢性がありますか? – Heikki

答えて

5
  1. を知らなくても許容されるオプションです。それはdbの検索を処理します。
  2. より多くの防弾では、そのフィールドに1)+一意のインデックスを使用します。検証エラーなしで保存に失敗した場合は、新しいコードを生成して再試行できます。
+0

説明してください2)?ユニークなインデックス? – donald

+0

http://stackoverflow.com/questions/1449459/how-to-make-column-unique-and-index-it-in-rails-migration – Heikki

+0

不明な点はわからないので、ユニークなインデックスキー、http://en.wikipedia.org/wiki/Unique_key)は、保存された値(またはそれらの組み合わせ)が一意であることを保証するデータベースレベルのものです。 – Heikki

0

2回は同じではないので、一意性を保証する最も簡単な方法は、時間に基づいた何らかのハッシュを使用することです。 xxx-xxxxを保存している場合は、自分自身を制限しています。独自の自動インクリメント値を使用することもできます。次の番号のサーバー側に値を格納し、新しい一意のIDを発行するたびにインクリメントします。

両方が通常のアプローチは:uniqueness検証を使用することで、追加情報を

0

時間に基づくハッシュは、実際には「ユニーク」であると「推測」されません。いくつかのタイプのハッシュを使用することは、大きなソースデータからダイジェストを作成する単なる方法です。すべてのデータは128ビット(md5を使用)で記述できるので、ハッシュ衝突に遭遇する可能性があります。

validates:uniqunessは、フィールド値が以前に使用されたかどうかを判断するクエリを実行します。あなたはこれを使うことができますが、あなたの唯一の解決策ではありません。フィールドが一意であることが意図されている場合は、データベース内の列にユニークなインデックスを配置する必要があります。レールの検証にのみ依存する場合は、テーブルへのデータ挿入時に競合状態になるリスクがあります。私は検証をバイパスすることができますが、別の書き込みも検証に合格する可能性があり、どちらもテーブルに入ることになります。

値を生成していますか、それともユーザー入力ですか?

+0

ちょっとしたコメントを追加するだけです。何を言おうとしているのは、入力の無限のセットに対して有限のハッシュセットがあるということです。しかし、多くの場合、ハッシュを作成することは「十分に良い」b/cです本当にユニークでなければなりません。本当にユニークなものが必要な場合は、ハッシュを使用しません。 –

+0

私はコントローラでそれを生成しています。 Pelase参照http://stackoverflow.com/questions/4609531/rails-3-handle-activerecordrecordnotunique-exception – donald

関連する問題