La modification de la Base de données des Identifiants de Console Rails?
J'ai une petite base de données et ont été l'ajout d'entrées à travers des Rails page. J' "détruit" l'une des entrées et maintenant ma séquence de Id sauter par un. Par exemple, j'ai maintenant 42 44, au lieu de l'évidence: 42, 43, 44.
Je me demandais si il y avait moyen de modifier le numéro d'identification d'un nouvel objet par le biais de la console. J'ai essayé:
record.id = 43
record.save
et
record = record.new
record.attributes = { :id => 43 }
mais les deux n'ont pas de travail. Je suis assez certain qu'il y a à être une méthode de console, mais je n'arrive pas à trouver beaucoup sur Google et j'ai probablement lu les Rails de l'API de manière incorrecte... aurais-je pu le faire en SQL directe dans sqlite?
Grâce
OriginalL'auteur nmiller | 2009-01-13
Vous devez vous connecter pour publier un commentaire.
Oui.
Le point de l'ensemble de ActiveRecord est que c'est des résumés DB fonctions et ne renvoie que des collections de données. Vous ne devriez pas vous soucier de l'ID d'un enregistrement, qui est quelque chose de spécifique à la bd. Du haut de ma tête que je ne peux pas penser à des raisons à la référence du modèle ID.
Si votre application dépend de la présence de la séquence numéro, puis vous devez ajouter un autre champ pour le modèle qui a cette. Par exemple, si j'ai un magasin avec des produits (un modèle de Produit) et je donne le numéro de l'ID de la DB fournit à d'autres fournisseurs. Deux semaines plus tard, mon patron me demande d'avoir un unique, mais une pièce d'identité similaire pour les deux variantes de produits: "45a" et "45b". Les noix. Le champ ID doit uniquement être utilisé par de la base de données et ActiveRecord, pas vous ou vos utilisateurs, pour identifier l'enregistrement.
Il y a une petite chance qu'il y pourrait être un obscur méthode de la force définit l'ID si la DB, il permet, mais il est obscur pour une raison. Ne pas essayer de le trouver 🙂
Tout cela étant dit, le type de
ruby script/dbconsole
rapidement tirer vers le haut l'sqlite interface sans avoir à taper votre mot de passe.Aussi, si vous supprimez la base de données sqlite qui va remettre le compteur à zéro et de commencer à 0. Avec un grand pouvoir vient une grande responsabilité.
MODIFIER
Si je me souviens bien, Dave Thomas écrit à ce sujet quelque part. Peut-être ici?
OriginalL'auteur Chris Lloyd
La meilleure façon de le faire est d'exécuter l'instruction SQL directement, et de résoudre ce temporelle erreur dans la séquence.
Essayez d'accéder à la console (ruby script/console) et le type:
44 l'objet nouvellement créé de l'id, et 43 est celui qui vous manquait dans votre tableau
Bonne chance!
Je suis d'accord que le fait de changer un ID est une Mauvaise Idée, mais quand vous avez besoin de restaurer des données, oh, disons, une base de données de production lorsque vous avez "perdu" quelques records? C'est parfait.
aussi bon si vous avez deux systèmes de synchronisation..
Sympa de penser à l'extérieur de la boîte.
Grâce Fer Martin!
OriginalL'auteur Fer Martin
En fait, vous pouvez définir l'id manuellement pour les nouveaux objets:
Cependant, ce que vous essayez de faire est de mettre à jour l'id d'un objet existant. Lorsque vous définissez
record.id = 43
et ensuite appelersave
ce qui se passe est que ActiveRecord va essayer de générer le SQL comme ceci:update records set id = 43 where id = 43
Notez que l'id, il cherche à mettre à jour est le même que celui que vous tentez de changer. C'est pourquoi il ne fonctionne pas.
Alors oui, vous devez utiliser SQL pour changer cela. Si oui ou non c'est une bonne idée, c'est un autre problème, mais parfois, il doit être fait.
Excellente solution, je souhaite que je pourrais double-vote pour l'obtenir vers le haut. J'aime solutions expliquer le problème. Et j'ai trouvé l'utilisation de ce pour la mise en œuvre normalisée "enum". Par exemple, un utilisateur peut avoir plusieurs rôles, mais ces rôles vont être cohérentes à l'échelle des déploiements, j'ai donc ajouter une tâche rake. Codage en dur des leurs id assure qu'ils sont la même chose sur ma boîte locale et le serveur. Pinailleurs, et peut-être jamais besoin, mais ça me fait un peu moins agité 🙂
OriginalL'auteur Luke Francl