:user_idはそのuser_idが存在するか確かめてくれる」という情報を得て、そんな隠れ仕様あんの?とおもってちょっと調べてみた。trueの用に関連名を指定するとそれっぽい動作をしなくもない。コードを追うとpresence系のバリデーション自体はActiveModel::Validations::PresenceValidatorで定義されている。options)次にadd_on_blankを見てみる。endendadd_on_blankメソッドはattributesの内容を走査してblankだったらerrorsに追加してるんだろうなーというのが読み取れる。実際に値を取ってきてるであろう:read_attribute_for_validationは何なのだろう。api.rubyonrails.orgで検索してもヒットしない。仕方ないからgitリポジトリをgrepして探す。すると以下の様なコードがみつかる。:sendつまりただのsend。:user_id)となり、結局は普通に指定した属性の値を見るに過ぎない。trueは普通にuser_idの値がblank?かどうかだけを見るので実際にそのuser_idでUserが存在するかチェックはしない。trueはどうかというと、instance.userがnilの状態でinstance.userを呼び出すとinstance.user_idでUserを取りにいく。そこでUserが存在しなければ[]が返ってくるのでblank?がtrueとなりこのバリデーションは失敗する。1なので、このケースに限って言えばそのIDのレコードが存在するか確認する動作をしている。trueこの様に直接値を入れてしまえばDBにselect文はなげない。いう動作をすることもあるだけで厳密にはそのIDのレコードが存在を確かめているわけではない。