0

レコードの作成時に特定のフィールドのデフォルト値が設定され、そのフィールドで検証を実行できるようにするには、モデルをどのように設定すればよいですか?

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にするよりエレガントな方法はありますか?

4

1 に答える 1

1

before_validation :defaults, :on => :create作成時にのみ呼び出される があります。

于 2013-05-29T21:52:37.993 に答える