PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je m'assurer que les lignes en double ne sont pas ajoutées à ma table de base de données via activerecords ?

Si l'intégrité des données est critique, vous ne devez pas utiliser une validation pour garantir l'unicité. Cela peut échouer. La seule façon de garantir l'unicité est d'utiliser une contrainte de base de données. C'est parce que les Rails validates_uniqueness peut avoir des conditions de concurrence.

Créez une migration pour ajouter l'index, ou modifiez votre existant pour refléter ce changement :

Pour un nouveau tableau :

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

Pour une table existante :

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

Vous pouvez maintenant continuer et ajouter une validation, comme d'autres l'ont suggéré, si vous souhaitez donner à votre utilisateur des commentaires sur le fait qu'il a déjà voté :

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