PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso garantir que as linhas duplicadas não sejam adicionadas à minha tabela de banco de dados por meio de registros ativos?


Se a integridade dos dados for crítica, você não deve usar uma validação para garantir a exclusividade. Pode falhar. A única maneira de garantir a exclusividade é usar uma restrição de banco de dados. Isso ocorre porque o Rails validates_uniqueness pode ter condições de corrida.

Crie uma migração para adicionar o índice ou altere a existente para refletir essa alteração:

Para uma nova tabela:
class CreateVotes < ActiveRecord::Migration
  def change
    create_table :votes do |t|
      t.belongs_to :voter
      t.belongs_to :votefor
      t.string :vote # Choose the correct column type
      t.timestamps
    end
    add_index :votes, [:voter_id, :votefor_id, :vote], unique: true
  end
end

Para uma tabela existente:
class AddUniqueIndexToVotes < ActiveRecord::Migration
  def change
    add_index :votes,  [voter_id, votefor_id, vote], unique: true
  end
end

Agora você pode ir em frente e adicionar uma validação, conforme sugerido por outros, se quiser dar ao seu usuário feedback de que ele já votou:
validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }