sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur säkerställer jag att duplicerade rader inte läggs till i min databastabell via activerecords?

Om dataintegriteten är kritisk bör du inte använda en validering för att garantera unikhet. Det kan misslyckas. Det enda sättet att garantera unikhet är att använda en databasrestriktion. Detta beror på att Rails validates_uniqueness kan ha tävlingsförhållanden.

Skapa en migrering för att lägga till indexet, eller ändra din befintliga för att återspegla denna ändring:

För ett nytt bord:

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

För en befintlig tabell:

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

Nu kan du gå vidare och lägga till en validering, som andra har föreslagit, om du vill ge dina användare feedback om att de redan har röstat:

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


  1. Kan jag upptäcka och hantera MySQL-varningar med PHP?

  2. slå samman flera bord

  3. Konvertera/koda sträng till siffror

  4. Scala Slick:MTable.getTables returnerar tom vektor/lista