88 votes

Rails auto-assignants qui existent déjà

J'ai créer un nouveau dossier comme ceci:

truck = Truck.create(:name=>name, :user_id=>2)

Ma base de données actuellement plusieurs milliers d'entités pour le camion, mais je lui ai donné la carte d'identité pour plusieurs d'entre eux, d'une manière qui a laissé quelques id est disponible. Donc ce qui se passe est de rails crée élément avec id = 150 et il fonctionne très bien. Mais alors qu'il tente de créer un article et de l'attribuer id = 151, mais que l'id n'existe pas déjà, donc je vais voir ce message d'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 je lance l'action, il sera tout simplement attribuer l'id 152, qui fonctionnera bien si cette valeur n'est pas déjà pris. Comment puis-je obtenir rails pour vérifier si l'ID existe déjà avant qu'il assigne?

Merci!

MODIFIER

Le Camion id est ce qui est dupliqué. L'utilisateur existe déjà et qui est une constante dans ce cas. C'est en réalité un héritage question que j'ai à traiter. Une option est de re-créer la table à laisser rails auto attribuer chaque id, cette fois. Je commence à penser que ce pourrait être le meilleur choix parce que je suis un peu d'autres problèmes, mais la migration pour le faire ce serait très compliqué, parce que le Camion est une clé étrangère dans de nombreux autres tables. Y aurait-il un moyen simple d'avoir des rails de créer une nouvelle table avec les mêmes données déjà stockées en vertu de Camion, auto-attribué ID et le maintien de toutes les relations existant?

196voto

Apie Points 1849

J'ai fait cela qui a résolu le problème pour moi.

 ActiveRecord::Base.connection.tables.each do |t|
  ActiveRecord::Base.connection.reset_pk_sequence!(t)
end;nil
 

J'ai trouvé la reset_pk_sequence! de ce fil. http://www.ruby-forum.com/topic/64428

85voto

Dondi Michael Stroma Points 1964

Rails est probablement à l'aide de l'intégré dans PostgreSQL séquence. L'idée d'une séquence, c'est qu'il est seulement utilisé une fois.

La solution la plus simple est de définir la séquence de votre entreprise.id de colonne à la valeur la plus élevée dans la table avec une requête comme ceci:

SELECT setval('company_id_seq', (SELECT max(id) FROM company));

Je devine à votre nom de la séquence "company_id_seq", nom de la table "société", et le nom de la colonne "id" ... s'il vous plaît de les remplacer par les bonnes. Vous pouvez obtenir le nom de la séquence avec SELECT pg_get_serial_sequence('tablename', 'columname'); ou de regarder la définition de la table avec \d tablename.

Une autre solution est de remplacer la méthode save() dans votre classe entreprise pour définir manuellement l'id de la société pour les nouvelles lignes avant de les enregistrer.

4voto

mynameiscoffey Points 2520

Cela me semble être un problème de base de données et non pas un problème de Rails. Est-il possible que votre base de données ait une graine d'identité incorrecte dans votre colonne id ? Pour tester, essayez de faire quelques insertions directement dans votre base de données et voyez si le même comportement existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: