I create a new record like so:
truck = Truck.create(:name=>name, :user_id=>2)
My database currently has several thousand entities for truck, but I assigned the id’s to several of them, in a way that left some id’s available. So what’s happening is rails creates item with id = 150 and it works fine. But then it tries to create an item and assign it id = 151, but that id may already exist, so I’m seeing this error:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
And the next time I run the action, it will simply assign the id 152, which will work fine if that value isn’t already taken. How can I get rails to check whether an ID already exists before it assigns it?
Thanks!
EDIT
The Truck id is what is being duplicated. The user already exists and is a constant in this case. It actually is a legacy issue that I have to deal with. One option, is to re-create the table at let rails auto assign every id this time around. I’m beginning to think this may be the best choice because I’m have a few other problems, but the migration for doing this would be very complicated because Truck is a foreign key in so many other tables. Would there be a simple way to have rails create a new table with the same data already stored under Truck, with auto-assigned ID’s and maintaining all existing relationships?
Rails is probably using the built-in PostgreSQL sequence. The idea of a sequence is that it is only used once.
The simplest solution is to set the sequence for your company.id column to the highest value in the table with a query like this:
I am guessing at your sequence name “company_id_seq”, table name “company”, and column name “id” … please replace them with the correct ones. You can get the sequence name with
SELECT pg_get_serial_sequence('tablename', 'columname');or look at the table definition with\d tablename.An alternate solution is to override the save() method in your company class to manually set the company id for new rows before saving.