ARでValidationをSkipして保存する

 AJAXで処理書くと、どうしてもCreateの時はデータが不完全でもとりあえず作りたい。みたいなことがあって、それは validate_on_create, validate_on_update で分けたり、各 validates_on_** :on => :update みたいな感じにかけばいいんだけど、sortable_list とかで単一フィールドだけごにょごにょやりたいときは結構困る。

 そんなときに使えそうなメソッド。があったんだけど、特に必要がなかったことがわかったという話。

activerecord-2.0.2/lib/active_record/validations.rb : line 932

引数にfalse渡せば、Validationをスキップしてsave出来る。

    # The validation process on save can be skipped by passing false. The regular Base#save method is
    # replaced with this when the validations module is mixed in, which it is by default.
    def save_with_validation(perform_validation = true)
      if perform_validation && valid? || !perform_validation
        save_without_validation
      else
        false
      end
    end

activerecord-2.0.2/lib/active_record/validations.rb : line 953

 こっちは、update_attribute のValidation無し版。

    # Updates a single attribute and saves the record without going through the normal validation procedure.
    # This is especially useful for boolean flags on existing records. The regular +update_attribute+ method
    # in Base is replaced with this when the validations module is mixed in, which it is by default.
    def update_attribute_with_validation_skipping(name, value)
      send(name.to_s + '=', value)
      save(false)
    end

と思ってソースを見てみたんだけど、save(false) って書いてあって、どうみても ValidationをSkipする方法でした。

validation を skip して save するときは 引数に false を渡す save(false) ということらしい。

update_attribute_with_validation_skipping(name, value) とかは、ぱっとみて何やってるかわかるんだけど、 save_with_validation(false) は一見して何してるか分かりにくいけど、 save(false) を知らないならどっち見ても分からないからかわらんねー。と思ったよ。

コメントを残す

メールアドレスが公開されることはありません。