Rails 5: Как я могу проверить уникальность на уровне базы данных, когда у меня также есть проверки на модели? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующая таблица соединения:

class ContactFormUsership < ApplicationRecord
  belongs_to :user
  belongs_to :contact_form

  validates :user_id, presence: true, uniqueness: { scope: :contact_form_id }
end

Это гарантирует, что при создании строки не будет дублированных пар user / contact_form.

У меня также есть индексы для этой таблицы, чтобы обеспечить уникальность на уровне БД:

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

Но это не проверяет, что невозможно создать повторяющиеся строки на уровне БД. Он только проверяет проверки.

Как мне проверить уникальность на уровне БД? Есть ли способ << без проверок?

1 Ответ

0 голосов
/ 12 сентября 2018

Так как вы пытаетесь проверить поведение вашей таблицы 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

...