Проверка уникальности перекрывающихся пар атрибутов

class Request < ActiveRecord::Base
  belongs_to :artist
  belongs_to :user
  belongs_to :petition
end

Класс Request предназначен для связи исполнителя или пользователя с петицией в ассоциации has_many, through:. В классе Request я хотел бы подтвердить, что пары петиция/исполнитель уникальны, и что пары петиция/пользователь также уникальны, но ни пользователь, ни исполнитель, ни петиция по отдельности не должны быть уникальными. По сути, он должен соответствовать этой спецификации:

describe 'Request' do
  it 'is unique for a petition and artist pair' do
    r1 = Request.new(petition_id: 1, artist_id: 1)
    r2 = Request.new(petition_id: 1, artist_id: 2)
    r3 = Request.new(petition_id: 1, artist_id: 2)
    r4 = Request.new(petition_id: 2, artist_id: 2)
    expect(r1.save).to be_truthy
    expect(r2.save).to be_truthy
    expect(r3.save).to be_falsy
    expect(r4.save).to be_truthy
  end

  it 'is unique for a petition and user pair' do
    r1 = Request.new(petition_id: 1, user_id: 1)
    r2 = Request.new(petition_id: 1, user_id: 2)
    r3 = Request.new(petition_id: 1, user_id: 2)
    r4 = Request.new(petition_id: 2, user_id: 2)
    expect(r1.save).to be_truthy
    expect(r2.save).to be_truthy
    expect(r3.save).to be_falsy
    expect(r4.save).to be_truthy
  end
end    

Я попытался использовать validates_uniquness_of:

validates_uniqueness_of :artist_id, scope: :petition_id
validates_uniqueness_of :user_id, scope: :petition_id

Но спецификации не работают для r2 в обоих случаях. Есть ли встроенный способ описания проверки, которую я ищу, или мне придется написать пользовательскую проверку?


person FeifanZ    schedule 22.07.2014    source источник
comment
Я думаю, добавление unique indexes к DB должно сработать для вас.   -  person Pavan    schedule 22.07.2014


Ответы (1)


Вы должны добавить allow_nil: true к обеим проверкам.

person rabusmar    schedule 22.07.2014