it-swarm.com.de

Eine Migration, um einer Kombination von Spalten eine eindeutige Einschränkung hinzuzufügen

Was ich brauche, ist eine Migration, um eine eindeutige Einschränkung auf eine Kombination von Spalten anzuwenden. für eine people Tabelle eine Kombination von first_name, last_Name und Dob sollten eindeutig sein.

130
rangalo

add_index :people, [:firstname, :lastname, :dob], :unique => true

229
Robert Speicher

Laut howmanyofme.com gibt es allein in den USA 46.427 Personen mit dem Namen John Smith. Das sind ungefähr 127 Tage. Da dies weit über der durchschnittlichen Lebensdauer eines Menschen liegt, ist ein DOB-Konflikt mathematisch sicher.

Ich sage nur, dass diese bestimmte Kombination von eindeutigen Feldern in Zukunft zu extremer Frustration von Benutzern und Kunden führen kann.

Betrachten Sie etwas, das tatsächlich einzigartig ist, wie eine nationale Identifikationsnummer, falls zutreffend.

(Mir ist klar, dass ich sehr spät zur Party komme, aber es könnte zukünftigen Lesern helfen.)

22
A Fader Darkly

Möglicherweise möchten Sie eine Einschränkung ohne Index hinzufügen. Dies hängt davon ab, welche Datenbank Sie verwenden. Unten finden Sie einen Beispiel-Migrationscode für Postgres. (tracking_number, carrier) ist eine Liste der Spalten, die Sie für die Einschränkung verwenden möchten.

class AddUniqeConstraintToShipments < ActiveRecord::Migration
  def up
    execute <<-SQL
      alter table shipments
        add constraint shipment_tracking_number unique (tracking_number, carrier);
    SQL
  end

  def down
    execute <<-SQL
      alter table shipments
        drop constraint if exists shipment_tracking_number;
    SQL
  end
end

Es gibt verschiedene Einschränkungen, die Sie hinzufügen können. Lesen Sie die Dokumentation

18
Josh

Hi Sie können beispielsweise einen eindeutigen Index in Ihrer Migration zu den Spalten hinzufügen

add_index(:accounts, [:branch_id, :party_id], :unique => true)

oder separate eindeutige Indizes für jede Spalte

7
Bohdan

Im typischen Beispiel einer Join-Tabelle zwischen Benutzern und Posts:

create_table :users
create_table :posts

create_table :ownerships do |t|
  t.belongs_to :user, foreign_key: true, null: false
  t.belongs_to :post, foreign_key: true, null: false
end

add_index :ownerships, [:user_id, :post_id], unique: true

Der Versuch, zwei ähnliche Datensätze zu erstellen, löst einen Datenbankfehler aus (in meinem Fall Postgres):

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id"
DETAIL:  Key (user_id, post_id)=(1, 1) already exists.
: INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id"

z.B. das machen:

Ownership.create!(user_id: user_id, post_id: post_id)
Ownership.create!(user_id: user_id, post_id: post_id)

Vollständig lauffähiges Beispiel: https://Gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced

db/schema.rb generiert: https://Gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a

4
Dorian