Ruby on rails rails验证所属关系
假设一个人有很多电话的简单关系。电话只包含一个必须唯一的电话号码Ruby on rails rails验证所属关系,ruby-on-rails,Ruby On Rails,假设一个人有很多电话的简单关系。电话只包含一个必须唯一的电话号码 class Telephone < ActiveRecord::Base validates_presence_of :contact_id belongs_to :contact validates :telephone, {:presence => true, :uniqueness => true} end class Contact <
class Telephone < ActiveRecord::Base
validates_presence_of :contact_id
belongs_to :contact
validates :telephone, {:presence => true, :uniqueness => true}
end
class Contact < ActiveRecord::Base
has_many :telephones
validates_associated :telephones
has_many :emails
has_many :addresses
validates_presence_of :firstname
accepts_nested_attributes_for :telephones, :allow_destroy=>true
validates_presence_of :lastname
end
test "telephone number must be unique" do
john = contacts :johndoe #johndoe is a person with 1 existing number
2.times do
john.telephones.build :telephone=> "123" # 123 doesnt exist yet
end
puts Telephone.count # this gives 1
john.save
puts Telephone.count # this gives 3 !!!! ???
assert not(john.valid?) # This validates unless I remove the save above
end
class电话true,:唯一性=>true}
结束
类联系人true
验证是否存在:lastname
结束
测试“电话号码必须唯一”do
john=联系人:johndoe#johndoe是一个拥有1个现有号码的人
2.5倍
john.telephones.build:telephone=>“123”#123还不存在
结束
放电话。计数#这是1
约翰,救命
放电话。计数#这是3???
assert not(john.valid?)#除非我删除上面的保存,否则这将进行验证
结束
有人能解释一下这个测试的结果吗
有更好的方法吗?我不理解这个测试的结果,它确实违背了我的期望。好的,如果你阅读ruby文档,你会注意到他们提到验证模型不足以实现唯一性。必须尽可能使用数据库唯一约束。否则,当使用两个进程/线程/任何东西时,都可能进行验证检查,以唯一方式通过,然后插入相同的值
tl;dr:在db列中添加一个唯一的约束。我接受这是答案,我想让您的db在这里做繁重的工作是一个很好的做法。但为了公平起见,文档提到了2个流程问题,而不是1个事务级联并保存其子事务。