7
votes

Méthode Activerecord To_i enlevé dans les rails 3.2.9

mis à niveau vers des rails 3.2.9 aujourd'hui à partir de 3.2.7 et il semble que la méthode "to_i" a été supprimée de Aciverecord.

est-ce par conception? Ou est-ce un bug? Je ne peux en trouver aucune mention dans les notes de changement. Cela va avoir une incidence sur beaucoup de code.

Merci!


1 commentaires

Je suis sur 3.2.6 et il n'y a pas de to_i sur les objets ou les relations deaciverecord ...


6 Réponses :


0
votes

Je ne crois pas que la méthode to_i a été disponible sur les objets AR eux-mêmes. Pouvez-vous être un peu plus précis sur les utilisations précédentes de la méthode, qui échoue maintenant?


0 commentaires

2
votes

Il y a eu un changement en ce qui concerne la méthode "to_i" dans les rails 3.2.9, mais qui traite des colonnes et non des tables. Voir ici .

Donc, dans votre code, si vous passez un objet entier au lieu de la valeur de la colonne, elle était en silence auparavant. Mais maintenant, il appellera la méthode "to_i" sur l'objet et soulever une exception.


0 commentaires

4
votes

La méthode #to_i n'a jamais existé, mais la manière dont l'attribution d'objets à des valeurs a Changé dans les rails 3.2.8 .

Compte tenu des éléments suivants: xxx

précédemment, vous pourriez attribuer un professeur à une conférence comme celle-ci: xxx

ou comme ceci: xxx

Dans le premier cas, tout est simple car le professeur un objet professeur. Dans le second cas, bien que ActiveCord a exercé une magie pour contraindre l'ID du professeur, comme le professeur_id attend un entier à la place.

dans les rails 3.2.8 et plus que la magie ne fonctionne plus . C'est bien de quelque manière que ce soit un indice que vous faites probablement quelque chose de mal. Par exemple, s'il n'y a pas de colonne professeur_id dans la base de données, mais juste professeur qui attend un entier, attribuer comme ça ne fonctionnera plus. < p> On dirait que ce sera réinitialisée au comportement précédent dans Rails 3.2.11 .


1 commentaires

Il n'y avait pas de "magie pour contraindre l'identité du professeur" en 3.2.8 et ci-dessous - il a toujours attribué 1, pas l'identifiant d'objet.



0
votes

Suivi sur Luca, j'utilise des rails 3.2.11 et je ne suis pas sûr d'avoir un tel code, mais j'ai trouvé cela pour ne plus travailler:

@lecture.update_attribute(:professor_id, Professor.find_by_id(1))


0 commentaires

2
votes

J'ai couru dans la même erreur. Ce n'est pas qu'Aciverecord manque de #to_i, mais quelque chose d'autre, lequel dans mon cas implique l'usine_girl Gem. xxx

Voici un cas isolé de la différence: xxx

puis dans la console: xxx

Cependant, si je fais la même séquence d'étapes avec: xxx

puis dans la console, je vois: xxx

Notez le nil user_id pour les rails 3.2.11


2 commentaires

Je suppose que si la colonne est ID, nous devons fournir un ID: : user_id => user.first.id


Ceci est correct - 3.2.9 L 'élève actuellement une exception si vous essayez d'attribuer un objet ActiveRecord à une colonne entière. Avant 3.2.8, c'était en fait cassé - usine (: note ,: user_id => user.find (6)) aurait toujours défini user_id sur 1, pas 6, pas 6 comme vous pouvez vous attendre à l'ID. Vous devez toujours appeler user.first.id .



0
votes

Ouais moi aussi j'ai le même problème lorsque je met à niveau les rails version 3.2.3 dans les rails 3.2.11.

Voici quelques extraits de code Quel problème exact est là

in rails 3.2.3
Doctor = Doctor.First
Patient = patient.Nouveau
PATIENT.DOCTOR_ID = Médecin (l'attribution d'objet droit est valide)
Patient.Save! (valide)
de
Dans les rails 3.2.11
Doctor = Doctor.First
Patient = patient.Nouveau
PATIENT.DOCTOR_ID = Docteur (l'attribution d'objet latéral droit n'est pas valide)
Patient.Save! (invalide)
Nométhoderror: erreur indéfinie 'to_i' Nous avons eu ce genre de missions.

Conclusion est que nous utilisons l'utilisation _id = entier que non seulement comme des missions d'objet.
Plus de détails < / p>


0 commentaires