Restrição de exclusividade do Rails e índice exclusivo db correspondente para coluna nula
Tenho o seguinte no meu arquivo de migração
def self.up
create_table :payment_agreements do |t|
t.boolean :automatic, :default => true, :null => false
t.string :payment_trigger_on_order
t.references :supplier
t.references :seller
t.references :product
t.timestamps
end
end
Quero garantir que, se um product_id for especificado, ele seja exclusivo, mas também deseje permitir nulo para que eu tenha o seguinte no meu modelo:
validates :product_id,
:uniqueness => true,
:allow_nil => true
Funciona muito bem, mas devo adicionar um índice ao arquivo de migração
add_index :payment_agreements, :product_id, :unique => true
Obviamente, isso gerará uma exceção quando dois valores nulos forem inseridos para product_id. Eu poderia simplesmente omitir o índice na migração, mas há a chance de obter dois PaymentAgreements com o mesmo product_id, como mostrado aqui:Concorrência e integridade
Minha pergunta é qual é a melhor / mais comum maneira de lidar com esse problema