【发布时间】:2009-09-26 02:01:15
【问题描述】:
The uniqueness validator of ActiveRecord 可以选择在值为 nil 或空白时跳过验证。即使我将两个参数都设置为 true (默认行为),我也可以在验证命中之前创建一个带有 nil 和空白的记录。我使用默认的 SQlite3 数据库 sqlite3-ruby (1.2.5)。
编辑澄清:如果我将validates_presence_of 添加到模型中,我会得到预期的结果。我认为validates_uniqueness_of 的默认行为会使这变得多余。
测试用例:
rails validation_test
cd validation_test/
script/generate Model Thing identification:string
rake db:migrate
app/models/thing.rb 的内容:
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
为什么前两个创造通过了?
谢谢
【问题讨论】:
-
+1 因为这是一个如何提问的模型。你清楚地说明了你做了什么,你看到了什么,你期望什么。
-
谢谢。但这似乎并不能防止被误解。 :)
标签: ruby-on-rails activerecord validates-uniqueness-of