sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo me aseguro de que no se agreguen filas duplicadas a la tabla de mi base de datos a través de registros activos?

Si la integridad de los datos es fundamental, no debe utilizar una validación para garantizar la exclusividad. Puede fallar. La única forma de garantizar la unicidad es usar una restricción de base de datos. Esto se debe a que Rails validates_uniqueness puede tener condiciones de carrera.

Cree una migración para agregar el índice o cambie el existente para reflejar este cambio:

Para una nueva tabla:

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 una tabla existente:

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

Ahora puede continuar y agregar una validación, como lo sugirieron otros, si desea dar a su usuario comentarios de que ya votaron:

validates :voter_id, uniqueness: { scope: [:votefor_id, :vote] }