代码之家  ›  专栏  ›  技术社区  ›  user3574603

rails5:当我对模型进行验证时,如何在数据库级别测试惟一性?

  •  0
  • user3574603  · 技术社区  · 6 年前

    我有以下联接表:

    class ContactFormUsership < ApplicationRecord
      belongs_to :user
      belongs_to :contact_form
    
      validates :user_id, presence: true, uniqueness: { scope: :contact_form_id }
    end
    

    它确保没有重复 user / contact_form 创建行时进行配对。

    我还在该表上设置了索引,以确保db级别的唯一性:

    t.index ["user_id", "contact_form_id"], name: "index_contact_form_userships_on_user_id_and_contact_form_id", unique: true
    

    test 'An error is raised if a user is added to a form more than once' do
      contact_form = ContactForm.create
      user = users(:user_1)
    
      assert_raises(ActiveRecord::RecordInvalid) do
        2.times do
          contact_form.users << user
        end
      end
    end
    

    如何在db级别测试唯一性?有没有办法 <<

    1 回复  |  直到 6 年前
        1
  •  3
  •   Billy Kimble    6 年前

    由于您正在尝试测试ContactFormUsership表的行为,因此可以执行以下操作:

    test 'An error is raised if a user is added to a form more than once' do
      contact_form = ContactForm.create
      user = users(:user_1)
    
      assert_raises(ActiveRecord::RecordInvalid) do
        c1 = ContactFormUsership.new(user: user, contact_form: contact_form)
        c1.save
        c2 = ContactFormUsership.new(user: user, contact_form: contact_form)
        c2.save(validate: false)
      end
    end
    

    您可以在上找到有关validate:false的更多信息 https://api.rubyonrails.org/classes/ActiveRecord/Validations.html