Railsのvalidationでのlambdaの使い方

こんにちは!kossyです!




さて、今回は、Railsのvalidationでのlambdaの使い方を
ブログに残してみたいと思います。




後置ifでlambdaを渡す

サンプルコードを晒してみます。

class User

  before_validation :name, presence: true if lambda { |obj| name.will_save_change_to_name? || name.present? }

end

before_validationはレコードを保存する前に実行されるコールバックで、
サンプルコード内ではnameに対して実行されるように設定しています。
presence: trueはいわゆるnot_null制約で、レコード保存時にnameが存在していないと例外を発生させます。

今回のコードのキモは後置ifに続くlambda文で、
nameが変更されているかチェックする構文がwill_save_change_to_name?です。

nameが変更されているか、nameが存在すればpresence: trueのvalidationが実行されるようになります。

このようにlambdaを渡すと、validationの実行条件をカスタマイズできるようになります。
実際にバリデーションを設定すると、
「このシチュエーションの時はバリデーションして欲しくないなぁ」
といったケースが出てくるので、そんな時にlambdaを渡すやり方を検討して見るといいと思います。