PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso assicurarmi che le righe duplicate non vengano aggiunte alla tabella del mio database tramite activerecords?

Se l'integrità dei dati è fondamentale, non dovresti utilizzare una convalida per garantire l'unicità. Può fallire. L'unico modo per garantire l'unicità è utilizzare un vincolo di database. Questo perché Rails validates_uniqueness può avere condizioni di gara.

Crea una migrazione per aggiungere l'indice o modifica quella esistente per riflettere questa modifica:

Per una nuova tabella:

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

Per una tabella esistente:

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

Ora puoi procedere e aggiungere una convalida, come suggerito da altri, se vuoi dare ai tuoi utenti un feedback che hanno già votato:

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