Witam,
Tak wygląd plik migracji:
[code=ruby]class CreateExecutives < ActiveRecord::Migration
def change
create_table :executives do |t|
t.string :forename, null: false, limit: 12
t.string :surname, null: false, limit: 14
t.string :phone, limit: 15
t.string :mobile, limit: 11
t.string :email, limit: 36
t.references :plant, null: false
t.integer :lock_version, null: false, default: 0
t.timestamps
end
add_index :executives, [:forename, :surname], unique: true
add_index :executives, :plant_id
execute "CREATE UNIQUE INDEX index_executives_on_phone ON executives (phone) WHERE phone IS NOT NULL;"
execute "CREATE UNIQUE INDEX index_executives_on_mobile ON executives (mobile) WHERE mobile IS NOT NULL;"
execute "CREATE UNIQUE INDEX index_executives_on_email ON executives (email) WHERE email IS NOT NULL;"
end
end[/code]
Jak widać phone, mibile i email, musi być unikalny, chyba że pole jest nullem to OK, nuli może być wiele.
Gdy wykonuje bezpośrednio na bazie zapytanie:
INSERT into executives (forename, surname, plant_id, created_at, updated_at) VALUES(‘IMIE’, ‘NAZWISKO’, 1, now(), now());
To zapytanie wchodzi.
INSERT into executives (forename, surname, plant_id, created_at, updated_at) VALUES(‘IMIE2’, ‘NAZWISKO2’, 1, now(), now());
Zapytanie wchodzi.
INSERT into executives (forename, surname, phone, plant_id, created_at, updated_at) VALUES(‘IMIE’, ‘NAZWISKO’, ‘123-123-123’, 1, now(), now());
Zapytanie wchodzi.
INSERT into executives (forename, surname, phone, plant_id, created_at, updated_at) VALUES(‘IMIE’, ‘NAZWISKO’, ‘’, 1, now(), now());
Zapytanie _nie_chodzi bo phone nie jest nilem tylko jest empty. Czyli OK.
Jak wypełniam formularz dodawania nowego executives i wypełniam pola: phone, mbile, email to się łądnie dodaje a jak nie wypełnię tych pól to dostaję błąd:
PG::Error: BŁĄD: podwójna wartość klucza narusza ograniczenie unikalności “index_executives_on_phone”
DETAIL: Klucz (phone)=() już istnieje.
: INSERT INTO “executives” (“created_at”, “email”, “forename”, “lock_version”, “mobile”, “phone”, “plant_id”, “surname”, “updated_at”) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING “id”
Powodem jest to że phone nie jest nilem tylko empty.
Jak to obejśc aby przy dodawaniu nowego executives bez wypełnionych pól phone, mobile i email zamiast empty, było nil, lub aby w tym:
: INSERT INTO “executives” (“created_at”, “email”, “forename”, “lock_version”, “mobile”, “phone”, “plant_id”, “surname”, “updated_at”) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING “id” nie było phone, email, mobile jeśli nie zostały wypełnione?