PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę się upewnić, że zduplikowane wiersze nie zostaną dodane do mojej tabeli bazy danych za pośrednictwem activerecords?

Jeśli integralność danych ma kluczowe znaczenie, nie należy używać walidacji w celu zagwarantowania niepowtarzalności. Może się nie udać. Jedynym sposobem zagwarantowania unikalności jest użycie ograniczenia bazy danych. Dzieje się tak, ponieważ Rails validates_uniqueness mogą mieć warunki wyścigowe.

Utwórz migrację, aby dodać indeks, lub zmień istniejący, aby odzwierciedlić tę zmianę:

Dla nowej tabeli:

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

Dla istniejącej tabeli:

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

Teraz możesz przejść dalej i dodać potwierdzenie, zgodnie z sugestią innych, jeśli chcesz przekazać swoim użytkownikom opinię, że już zagłosowali:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. znajdowanie zapytania MAX(db_timestamp)

  2. Nie można połączyć się z Postgres DB, ponieważ typ uwierzytelniania 10 nie jest obsługiwany

  3. Jak przekazać niestandardową tablicę typów do funkcji Postgres

  4. Odfiltrowywanie zduplikowanych kolejnych rekordów w SELECT

  5. PostgreSQL:Jak indeksować wszystkie klucze obce?