Если при проверке уникальности происходит совпадение с ActiveRecord::AssociationTypeMismatch
Я разрабатываю Rails5 API и получаю ActiveRecord::AssociationTypeMismatch: ошибка при тестировании ассоциаций моделей. Вот код:
user.rb:
class User < ApplicationRecord
acts_as_paranoid
has_secure_password
has_many :contracts
end
service.rb:
class Service < ApplicationRecord
acts_as_paranoid
has_many :contracts
end
contract.rb:
class Contract < ApplicationRecord
acts_as_paranoid
belongs_to :user
belongs_to :service
validates_presence_of :user
validates :service, presence: true, uniqueness: { scope: :user_id }
end
contract_spec.rb:
RSpec.describe Contract, type: :model do
let(:contract) { create(:contract) }
describe 'Validations' do
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:service) }
it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }
end
describe 'Associations' do
it { is_expected.to belong_to(:user) }
it { is_expected.to belong_to(:service) }
end
end
Мои тесты не проходят с:
1) Contract Validations should validate that :service is case-sensitively unique within the scope of :user_id
Failure/Error: it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }
ActiveRecord::AssociationTypeMismatch:
Service(#47073011870820) expected, got String(#47072966778980)
Мне кажется, некоторые другие вопросы выглядят так, но ни у одного из них не было рабочего решения этой проблемы. Любая помощь будет оценена.
1 ответ
Я столкнулся с той же проблемой. Одним из обходных путей является определение subject
describe 'Validations' do
subject { create(:contract) }
it { is_expected.to validate_presence_of(:user) }
it { is_expected.to validate_presence_of(:service) }
it { is_expected.to validate_uniqueness_of(:service).scoped_to(:user_id) }
end
Источник: validates_uniqueness_of не работает, когда запись новая и атрибут является ассоциацией