sql >> Databáze >  >> RDS >> PostgreSQL

Jak zajistím, aby se do mé databázové tabulky prostřednictvím activerecords nepřidávaly duplicitní řádky?

Pokud je integrita dat kritická, neměli byste používat ověřování k zaručení jedinečnosti. Může selhat. Jediným způsobem, jak zaručit jedinečnost, je použití databázového omezení. Je to proto, že Rails validates_uniqueness může mít závodní podmínky.

Chcete-li přidat index, vytvořte migraci nebo změňte svůj stávající tak, aby odrážel tuto změnu:

Pro novou tabulku:

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

Pro existující tabulku:

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

Nyní můžete pokračovat a přidat ověření, jak navrhli ostatní, pokud chcete svým uživatelům poskytnout zpětnou vazbu, že již hlasovali:

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


  1. Součet časového rozdílu mezi řádky

  2. Zkraťte (ne zaokrouhlujte) desetinná místa v SQL Server

  3. Proč by Magento nedokázalo uložit zákazníka po vygenerování ID?

  4. Potvrzení PostgreSQL Sqlalchemy zabere hodně času