Je crée un nouveau disque comme ceci:
truck = Truck.create(:name=>name, :user_id=>2)
Ma base de données contient actuellement plusieurs milliers d'entités pour les camions, mais j'ai attribué les identifiants à plusieurs d'entre eux, de manière à laisser certains identifiants disponibles. Donc, ce qui se passe, c'est que les rails créent un élément avec id = 150 et cela fonctionne bien. Mais ensuite, il essaie de créer un élément et de lui attribuer id = 151, mais cet identifiant peut déjà exister, donc je vois cette erreur:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
Et la prochaine fois que j'exécuterai l'action, elle attribuera simplement l'id 152, ce qui fonctionnera bien si cette valeur n'est pas déjà prise. Comment puis-je obtenir des rails pour vérifier si un identifiant existe déjà avant de l'attribuer?
Merci!
ÉDITER
L'identifiant du camion est ce qui est dupliqué. L'utilisateur existe déjà et est une constante dans ce cas. C'est en fait un problème hérité que je dois régler. Une option consiste à recréer la table en laissant les rails attribuer automatiquement chaque id cette fois-ci. Je commence à penser que c'est peut-être le meilleur choix car j'ai quelques autres problèmes, mais la migration pour ce faire serait très compliquée car Truck est une clé étrangère dans tant d'autres tables. Y aurait-il un moyen simple de faire en sorte que les rails créent une nouvelle table avec les mêmes données déjà stockées sous Camion, avec des ID attribués automatiquement et en conservant toutes les relations existantes?
Réponses:
Rails utilise probablement la séquence PostgreSQL intégrée. L'idée d'une séquence est qu'elle n'est utilisée qu'une seule fois.
La solution la plus simple consiste à définir la séquence de la colonne company.id sur la valeur la plus élevée de la table avec une requête comme celle-ci:
Je devine votre nom de séquence "company_id_seq", le nom de table "company" et le nom de colonne "id" ... veuillez les remplacer par les bons. Vous pouvez obtenir le nom de la séquence avec
SELECT pg_get_serial_sequence('tablename', 'columname');
ou consulter la définition de la table avec\d tablename
.Une autre solution consiste à remplacer la méthode save () dans votre classe d'entreprise pour définir manuellement l'ID de société pour les nouvelles lignes avant d'enregistrer.
la source
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.
J'ai fait cela, ce qui a résolu le problème pour moi.
J'ai trouvé le reset_pk_sequence! à partir de ce fil. http://www.ruby-forum.com/topic/64428
la source
ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Basé sur la réponse @Apie .
Vous pouvez créer une tâche et l'exécuter lorsque vous en avez besoin avec:
Vous créez des tâches comme celle-ci:
Et dans le fichier generated (
lib/tasks/database.rake
) mettez:la source
Cela me semble être un problème de base de données et non un problème de Rails. Est-il possible que votre base de données ait une graine d'identité incorrecte sur votre
id
colonne? Pour tester, essayez de faire quelques insertions directement dans votre base de données et voyez si le même comportement existe.la source
J'ai résolu ce problème en suivant la commande.
Exécutez ceci dans votre console de rails
la source