2017.05 «  - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - » 2017.07
TOP > validates_uniqueness_of はなんかスゴい

 ← validates_acceptance_of | TOP | スタイルシートをインクルードする

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑TOPへ

validates_uniqueness_of はなんかスゴい 

モデル model ファイルの中に、いろいろなバリデーションが書けるのですが、validates_uniqueness_of という種類もあります。

指定されたカラムについて、DB のテーブル中のデータに重複があれば、エラーにしてしまう、というマジカルなメソッドです。

例えば

validates_presence_of :favorite_team



なーんてやったりすると、このモデルのテーブルの favorite_team というカラムに、重複した値を insert したり、update したりしようとすると、エラーが出まして、insert したり、update したりできません。

なかなかスゴいエラーチェックだと思いました。

あと、応用編として、範囲を狭めることができます。

validates_presence_of :favorite_team, :scope => :login_name



とすると、同じ login_name を持つ人限定で、重複した favorite_team を複数 insert したり update したり出来なくなります。

分かりづらいかも?じゃあ、例で示してみます。

login_name = 1, favorite_team = 広島
login_name = 2, favorite_team = 巨人

というデータがテーブルの中にあったとして、新たに次のデータは挿入できます。

login_name = 1, favorite_team = 巨人
login_name = 2, favorite_team = 広島

でも、次のデータは挿入できません。

login_name = 1, favorite_team = 広島
login_name = 2, favorite_team = 巨人

というわけでした。

では、Wiedersehen!!

[追記 07/08/05]
でも、もっと調べてみると、これで DB カラムのデータとして唯一であることを保証されないようです。

rails が平行して動いているときに、同じタイミングで、同じカラムに対して、同じ値で validates_presence_of で調べて、どちらもバリデーションが OK と、通ったら、この同じ値が 2 つ DB に保存されることもありうるそうです。

というわけで、究極的には、DB の UNIQUE インデックスなどであるカラムに対するデータの uniqueness を守るしかなさそうです。

例えとしては、ブラウザから入力された値の長さチェックを Javascript クライアントサイドでしても、サーバーサイドで再びもう一回長さチェックをしなければいけないよぉ、という関係に似ているでしょうか。validates_presence_of と DB Unique インデックスは。

分かりづらいですって?その旨、コメント欄にお願いします!そのときはもっと分かりやすい例えを考えるつもりです。

【広告】

[2007.08.02(Thu) 15:07] RubyOnRails(Model)Trackback(0) | Comments(0)
↑TOPへ

 ← validates_acceptance_of | TOP | スタイルシートをインクルードする

COMMENT

COMMENT POST















管理者にだけ表示

 ← validates_acceptance_of | TOP | スタイルシートをインクルードする
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。