рельсы проверяют отношение принадлежат - PullRequest
0 голосов
/ 05 мая 2011

Учитывая простые отношения, в которых Person has_many Телефоны. А телефон содержит только номер телефона, который должен быть уникальным!

    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

Может ли кто-нибудь объяснить результаты этого теста.

  1. просто вызов действительный? не удается, но это упоминается в rdoc (необходимо сначала сохранить)
  2. сохранение первым делает действительным? передать

НО теперь у меня фактически есть 3 записи в базе данных, что нарушает мое уникальное требование.

Есть ли лучший способ сделать это? Я не понимаю результат этого теста, он действительно противоречит моим ожиданиям.

1 Ответ

1 голос
/ 05 мая 2011

Хорошо, если вы прочитаете документацию по ruby, вы заметите, что они упоминают, что проверки модели недостаточно для уникальности.ВЫ ДОЛЖНЫ использовать уникальные ограничения базы данных всякий раз, когда это возможно.В противном случае это возможно при использовании двух процессов / потоков / независимо от того, что оба будут выполнять проверку правильности, передавать как уникальные, а затем вставлять одинаковые значения.

tl; dr: Добавить уникальное ограничение к столбцу db.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...