The uniqueness validator of ActiveRecordには、値がnilまたは空白の場合は検証をスキップするオプションがあります。両方のパラメータをtrue(デフォルトの動作)に設定しても、検証ヒットの前にnilと空白のレコードを作成できます。私はデフォルトのSQlite3データベースsqlite3-ruby(1.2.5)を使用します。validates_uniqueness_ofがnilまたはblank(allow_nilおよびallow_blankなし)に渡す場合
説明のために編集:validates_presence_of
をモデルに追加すると、予想通りの結果が得られます。私はvalidates_uniqueness_of
のデフォルトの動作がこれを冗長にすると考えました。
テストケース:アプリ/モデル/ thing.rbの
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
内容:
class Thing < ActiveRecord::Base
validates_uniqueness_of :identification
end
Railsのコンソール:
script/console
Loading development environment (Rails 2.3.4)
>> Thing.create!
=> #<Thing id: 1, identification: nil, created_at: "2009-09-26 01:49:32", updated_at: "2009-09-26 01:49:32">
>> Thing.create! :identification => ""
=> #<Thing id: 2, identification: "", created_at: "2009-09-26 01:49:42", updated_at: "2009-09-26 01:49:42">
>> Thing.create! :identification => ""
ActiveRecord::RecordInvalid: Validation failed: Identification has already been taken
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/validations.rb:1090:in `save_without_dirty!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/dirty.rb:87:in `save_without_transactions!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:182:in `transaction'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:200:in `save!'
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.4/lib/active_record/validations.rb:1059:in `create!'
from (irb):3
>> Thing.count
=> 2
なぜ最初の2点の作品が通過していますか?
ありがとうございました
+1これは質問する方法のモデルですので、あなたは、あなたが何をしたか、あなたが見たもの、そしてあなたが期待したものを明確に述べました。 – jdl
ありがとうございます。しかし、これは誤解されることを防ぐものではないようです。 :) – Roman