Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails验证所属关系_Ruby On Rails - Fatal编程技术网

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?)#除非我删除上面的保存,否则这将进行验证
结束
有人能解释一下这个测试的结果吗

  • 只是打电话而已?失败,但rdoc中提到了这一点(必须先保存)
  • 先保存是否有效?通过
  • 但是现在我的数据库中实际上有3条记录,这打破了我的独特要求


    有更好的方法吗?我不理解这个测试的结果,它确实违背了我的期望。

    好的,如果你阅读ruby文档,你会注意到他们提到验证模型不足以实现唯一性。必须尽可能使用数据库唯一约束。否则,当使用两个进程/线程/任何东西时,都可能进行验证检查,以唯一方式通过,然后插入相同的值


    tl;dr:在db列中添加一个唯一的约束。

    我接受这是答案,我想让您的db在这里做繁重的工作是一个很好的做法。但为了公平起见,文档提到了2个流程问题,而不是1个事务级联并保存其子事务。