Saya membuat rekor baru seperti ini:
truck = Truck.create(:name=>name, :user_id=>2)
Database saya saat ini memiliki beberapa ribu entitas untuk truk, tetapi saya menetapkan id ke beberapa di antaranya, dengan cara yang membuat beberapa id tersedia. Jadi yang terjadi adalah rel membuat item dengan id = 150 dan berfungsi dengan baik. Tetapi kemudian mencoba untuk membuat item dan menetapkannya id = 151, tetapi id itu mungkin sudah ada, jadi saya melihat kesalahan ini:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
Dan lain kali saya menjalankan tindakan, itu hanya akan menetapkan id 152, yang akan berfungsi dengan baik jika nilai itu belum diambil. Bagaimana saya bisa mendapatkan rel untuk memeriksa apakah ID sudah ada sebelum menetapkannya?
Terima kasih!
EDIT
Id truk adalah apa yang sedang diduplikasi. Pengguna sudah ada dan dalam kasus ini adalah konstanta. Ini sebenarnya adalah masalah warisan yang harus saya tangani. Salah satu opsinya, adalah membuat ulang tabel di let rails secara otomatis menetapkan setiap id kali ini. Saya mulai berpikir ini mungkin pilihan terbaik karena saya memiliki beberapa masalah lain, tetapi migrasi untuk melakukan ini akan sangat rumit karena Truck adalah kunci asing di banyak tabel lainnya. Akankah ada cara sederhana untuk membuat rel membuat tabel baru dengan data yang sama sudah disimpan di bawah Truck, dengan ID yang ditetapkan secara otomatis dan mempertahankan semua hubungan yang ada?
sumber
Jawaban:
Rails mungkin menggunakan urutan PostgreSQL bawaan. Ide urutan adalah bahwa itu hanya digunakan sekali.
Solusi paling sederhana adalah dengan mengatur urutan kolom company.id Anda ke nilai tertinggi dalam tabel dengan query seperti ini:
Saya menebak nama urutan Anda "company_id_seq", nama tabel "perusahaan", dan nama kolom "id" ... tolong ganti dengan yang benar. Anda bisa mendapatkan nama urutan dengan
SELECT pg_get_serial_sequence('tablename', 'columname');
atau melihat definisi tabel dengan\d tablename
.Solusi alternatifnya adalah menimpa metode save () di kelas perusahaan Anda untuk secara manual mengatur id perusahaan untuk baris baru sebelum menyimpan.
sumber
create table t (id serial not null primary key); insert into t values (1); insert into t values (default); ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (id)=(1) already exists.
Saya melakukan ini yang memecahkan masalah untuk saya.
Saya menemukan reset_pk_sequence! dari utas ini. http://www.ruby-forum.com/topic/64428
sumber
ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Berdasarkan jawaban @Apie .
Anda dapat membuat tugas dan menjalankannya saat Anda membutuhkannya dengan:
Anda membuat tugas seperti ini:
Dan di file yang dihasilkan (
lib/tasks/database.rake
) letakkan:sumber
Kedengarannya seperti masalah database dan bukan masalah Rails. Mungkinkah database Anda memiliki seed identitas yang tidak tepat di
id
kolom Anda ? Untuk menguji coba lakukan beberapa penyisipan langsung ke database Anda dan lihat apakah ada perilaku yang sama.sumber
Saya menyelesaikan masalah ini dengan mengikuti perintah.
Jalankan ini di konsol rel Anda
sumber