[解決済み] Rails の "validates_uniqueness_of" の大文字小文字を区別する機能
質問
SQLLite3を使用したモデルです。
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
例えば、"Yale"を追加した後、"Yale"を追加することはできませんが、次のようになります。 を追加することができます。 は追加できますが、は追加できます。
編集:それを見つけた - 。 アクティブレコードの検証
どのように解決するのですか?
validates_uniqueness_of :name, :case_sensitive => false
はトリックを実行しますが、次のことに注意する必要があります。
validates_uniqueness_of
は
ではなく
は、複数のサーバ/サーバプロセス(例:Phusion Passengerの実行、複数のMongrelなど)またはマルチスレッドサーバがある場合、一意性を保証するものではありません。 それは、このような一連のイベントが発生する可能性があるからです(順番は重要です)。
- プロセス A が 'foo' という名前の新規ユーザーを作成するためのリクエストを取得します。
- プロセスBが同じことを行う
- プロセスAは、DBにその名前がまだ存在するかどうかを尋ねて、DBがその名前はまだ存在しないと言うことで、'foo'の一意性を検証します。
- プロセスBは同じことを行い、同じ応答を得る
-
プロセス A は
insert
ステートメントを送信し、成功します。 -
そのフィールドに一意性を必要とするデータベース制約がある場合、プロセスBは、そのフィールドのために
insert
ステートメントを新しいレコードのために送信し 失敗 となり、SQL アダプタから醜いサーバ例外が返されます。 データベース制約がない場合、挿入は成功し、名前として 'foo' を持つ 2 つの行が作成されます。
の "同時実行と整合性" も参照してください。
validates_uniqueness_of
Railsのドキュメントを参照してください。
から Ruby on Rails 第3版 :
<ブロッククオート...その名前にもかかわらず、validates_uniqueness_ofはカラムの値が一意であることを実際に保証するものではありません。できることは、検証が行われた時点で、検証対象のレコードと同じ値を持つカラムがないことを確認することだけです。一意であるべきカラムに同じ値を持つレコードを同時に2つ作成し、両方のレコードが検証をパスすることもあり得ます。一意性を強制する最も信頼できる方法は、データベースレベルの制約を用いることです。
以下も参照してください。
このプログラマの経験
と
validates_uniqueness_of
.
これがよく起こる方法の1つは、新しいアカウントを作成するときに、誤ってWebページから二重投稿してしまうことです。 これは、ユーザーが受け取るのは 2 番目の (醜い) エラーであり、実際には登録に成功したのに、登録に失敗したと思わせてしまうため、解決するのが難しい問題です。 これを防ぐために私が見つけた最良の方法は、二重投稿を防ぐためにjavascriptを使用することだけです。
関連
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] 構文エラー "構文エラー、予期しない入力終了、keyword_endを期待 (SyntaxError)"
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] rspec 3 - クラスメソッドをスタブ化する
-
[解決済み] DestroyとDeleteの違い
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] 未初期化の定数 "コントローラ名"