レコードの作成時に特定のフィールドのデフォルト値が設定され、そのフィールドで検証を実行できるようにするには、モデルをどのように設定すればよいですか?
bar
例として、レコードの作成時に値が指定されていない場合、デフォルトで 0 にするフィールドがあるとします。また、 bar が nil でないことを確認したいと思いますvalidates_presence_of :bar
。
私がこれを行う場合:
before_create :defaults
def defaults
bar ||= 0
end
...その場合、デフォルトは機能しません。デフォルトを呼び出す前に bar が nil であるため、検証は失敗します。
しかし、私がこれを行うと:
before_validation :defaults
def defaults
bar ||= 0
end
次に、すべての検証の前にデフォルトが設定され、次のように奇妙な結果が生成されます。
foo = Foo.new
foo.bar = nil
foo.save!
bar を無効な値に設定しようとしたために例外が発生する代わりに、保存が成功し、bar が 0 に設定されます。
私はこれを行うことができると思います:
before_validation :defaults
def defaults
if new_record?
bar ||= 0
# set any other default values
end
end
...しかし、それは非効率的であることは言うまでもなく、少し臭いようです(作成時にのみ気にするものは、検証ごとに呼び出されます)。
バリデーションがチェックされ、作成時にのみバーのデフォルトを 0にするよりエレガントな方法はありますか?