ここにモデルがあります(私はSQLLite3を使用しています):
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
たとえば、「エール」を追加した後、「エール」を追加することはできませんが、「エール」を追加することはできます。検証の大文字と小文字を区別しないようにするにはどうすればよいですか?
編集:見つけました- アクティブレコードの検証
ここにモデルがあります(私はSQLLite3を使用しています):
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
たとえば、「エール」を追加した後、「エール」を追加することはできませんが、「エール」を追加することはできます。検証の大文字と小文字を区別しないようにするにはどうすればよいですか?
編集:見つけました- アクティブレコードの検証
回答:
validates_uniqueness_of :name, :case_sensitive => false
トリックはありませんが、あなたは心に留めておく必要があるvalidates_uniqueness_of
んではないか、マルチスレッドサーバー(例えばのPhusion旅客、複数の雑種などを実行している)を使用すると、複数のサーバ/サーバ・プロセスを持っている場合は、一意性を保証します。これは、次の一連のイベントが発生する可能性があるためです(順序は重要です)。
insert
新しいレコードのステートメントを送信し、成功するinsert
新しいレコードのステートメントを送信し、SQLアダプターから返される醜いサーバー例外で失敗します。データベース制約がない場合、挿入は成功し、名前が「foo」の2つの行ができます。validates_uniqueness_of
Railsのドキュメントの「同時実行性と整合性」も参照してください。
...その名前にもかかわらず、validates_uniqueness_ofは実際には列の値が一意であることを保証しません。それができることは、検証が実行されたときに検証されているレコードと同じ値を持つ列がないことを確認することだけです。2つのレコードが同時に作成され、一意である必要がある列に同じ値があり、両方のレコードが検証に合格する可能性があります。一意性を強制する最も信頼できる方法は、データベースレベルの制約を使用することです。」
参照してください。このプログラマの経験を持つがvalidates_uniqueness_of
。
これが一般的に発生する1つの方法は、新しいアカウントを作成するときにWebページから誤って二重に送信されることです。これは解決が難しい問題です。ユーザーが返すのは2番目の(醜い)エラーであり、実際には成功したにもかかわらず、登録が失敗したとユーザーに思わせるからです。これを防ぐ最善の方法は、javascriptを使用して二重送信を防ぐことです。
Rails 3では、モデルでこれを行うことができます:
validates :name, :uniqueness => true
またはcase_sensitiveなし
validates :name, :uniqueness => {:case_sensitive => false}
同様の質問がありますが、答えはより興味深いです:https : //stackoverflow.com/a/6422771
基本的に、を使用:case_sensitive => false
すると、非常に非効率的なデータベースクエリが実行されます。