sql >> Database >  >> RDS >> PostgreSQL

Hoe zorg ik ervoor dat er geen dubbele rijen worden toegevoegd aan mijn databasetabel via activerecords?

Als gegevensintegriteit van cruciaal belang is, moet u geen validatie gebruiken om uniciteit te garanderen. Het kan mislukken. De enige manier om uniciteit te garanderen, is door een databasebeperking te gebruiken. Dit komt omdat de Rails validates_uniqueness kan racecondities hebben.

Maak een migratie om de index toe te voegen, of wijzig uw bestaande om deze wijziging weer te geven:

Voor een nieuwe tafel:

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

Voor een bestaande tafel:

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

Nu kunt u doorgaan en een validatie toevoegen, zoals voorgesteld door anderen, als u uw gebruikers feedback wilt geven dat ze al hebben gestemd:

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


  1. Hoe de Time()-functie werkt in SQLite

  2. Meerdere buitenlandse sleutels?

  3. Hoe in te voegen in MYSQL-rij vanuit meerdere $_POST-arrays

  4. Waarom retourneert password_verify false?