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

Hvordan sikrer jeg, at duplikerede rækker ikke tilføjes til min databasetabel via activerecords?

Hvis dataintegritet er kritisk, bør du ikke bruge en validering for at garantere unikhed. Det kan fejle. Den eneste måde at garantere unikhed på er at bruge en databasebegrænsning. Dette skyldes, at Rails validates_uniqueness kan have løbsforhold.

Opret en migrering for at tilføje indekset, eller skift dit eksisterende for at afspejle denne ændring:

For et nyt 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

For en eksisterende tabel:

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

Nu kan du gå videre og tilføje en validering, som foreslået af andre, hvis du vil give din brugerfeedback om, at de allerede har stemt:

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


  1. java.lang.ClassNotFoundException:com.mysql.jdbc.Driver under Runtime (eclipse / maven /tomcat)

  2. Tabellen 'performance_schema.session_variables' eksisterer ikke

  3. Hvordan sætter jeg backticks i et kolonnenavn kaldet key for hibernate

  4. tæl antallet af rækker og få kun den sidste række fra en tabel