Проверка уникальности Rails прекрасно работает с целочисленными столбцами.Однако ваше перечисление недопустимо в синтаксисе Ruby.
class Address < ApplicationRecord
belongs_to :user
enum :address_type => [ :primary, :mailing, :billing ]
# or preferably with Ruby 2.0+ hash syntax
enum address_type: [ :primary, :mailing, :billing ]
# ...
end
Вы можете проверить валидацию, вызвав .valid?
в экземпляре модели и проверив объект error :
require 'rails_helper'
RSpec.describe Address, type: :model do
let(:user) { create(:user) }
it "should require the user id to be unique" do
Address.create(user: user, address_type: :primary)
duplicate = Address.new(user: user, address_type: :primary)
expect(duplicate.valid?).to be_falsy
expect(duplicate.errors.full_messages_for(:address_type)).to include "Address type has already been taken"
end
end
Остерегайтесь только проверки expect(duplicate.valid?).to be_falsy
и expect(duplicate.valid?)
, так как это может привести к ложным срабатываниям / отрицаниям.Вместо этого проверьте конкретное сообщение об ошибке или ключ. Должны-соответствовать довольно хорош для этой цели, но не является строго необходимым.
require 'rails_helper'
RSpec.describe Address, type: :model do
# shoulda-matchers takes care of the boilerplate
it { should validate_uniqueness_of(:address_type).scoped_to(:user_id) }
end
Вам также следует рассмотреть возможность добавления составного уникального индекса на addresses.address_type
и addresses.user_id
, поскольку это предотвратит проблемы с расой .