読者です 読者をやめる 読者になる 読者になる

Sequel::Model でキャストできない値をセットしたら例外が発生するのを抑制してみる

ruby

例えば、Sequel::Model を使って次のようなクラスを定義したとします。

# coding: utf-8
require "sequel"

DB = Sequel.sqlite("test.db")

DB.create_table? :records do
  primary_key   :id
  Date          :date
  String        :summary
  Float         :kcal
  DateTime      :created_at
end

class Record < Sequel::Model
  plugin :validation_helpers

  def validate
    validates_presence [:summary, :kcal, :date]
    validates_numeric :kcal
    validates_type Date, :date
    validates_type String, :summary
    validates_type DateTime, :created_at
  end
end

このクラスに対して

Record.new(:kcal => "hoge")

とか

@record = Record[id]
@record.set(:kcal => "hoge")

とかやると、Float に変換できないため例外が発生してしまいます。

入力はとりあえず何でも受け付けて、検証してみてエラーだったらメッセージを表示したいので、セットしたときに例外を出されたら都合が悪い。

そこで、キャストできなかったとき例外が発生するのを抑制してみます。

Sequel::Model.raise_on_typecast_failure = false

これで OK。ActiveRecord と同じ感覚で使っていたから、ハマってしまいました。