Sequelのvalidation_helpersの使い方

 Sequelのvalidation_helpersの使い方がよくわからなくて、試行錯誤したのでメモしておく。

class Documents < Sequel::Model
  plugin :validation_helpers

  def validate
    validates_min_length 1, :title
    validates_min_length 1, :body
  end

  unless table_exists?
    set_schema do
      primary_key :id
      string :title
      string :body
    end
  end
end

doc = Documents.new(:title => "", :body => "")
doc.validate
p doc.errors

 plugin :validation_helpersとか def validateのあたりはオフィシャルなマニュアルにも書いてあるので特に問題ないと思われる。
 注意しないといけないのは、

  • バリデーション用のメソッドを自分で呼び出さないといけない(doc.validateのあたり)
  • バリデーションに失敗しても例外が飛んだりする訳ではないし普通にsaveメソッドで保存できる

 というあたりだろう。ActiveRecordだとsave時にvalidationが自動で働いて、validationに失敗するとそもそも保存されないのだが、Sequelのvalidation_helpersは全然まったくそんなことはない。validateは自分で呼び出さないといけないし、バリデーションに失敗した状態でも普通に保存できる。
 この挙動に気づかず、最初は Documents.insert(params) みたいなコードを書いていて、全然validationが実行されずに困った。バリデーションしたい場合はinsertを使わずに、newしてvalidateしてエラーのチェックが必要、という手順を自分で実行する必要があるようだ。
 エラーメッセージは一つのパラメーターに関しては一つしか出力しないし、エラーメッセージもSequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS[:min_length][:message] みたいなのを書き換えれば簡単にカスタマイズできるし、そこら辺は結構使い勝手が良い。validateメソッド自体が自分で定義している物なので、複雑なバリデーションは自分で好き勝手にバリデーションをかければいいしね。