2010-12-01 11 views
0

Je ne suis pas en mesure de mettre à jour un enregistrement associé à Rails.Problème lors de la mise à jour d'un enregistrement associé à Rails

Par exemple, j'ai un modèle Post et un modèle User. En post.rb j'ai inclus l'association belongs_to :user.

Si je veux modifier le champ user_id pour un enregistrement Post existant, cela ne fonctionne pas. Ce qui précède ne modifie pas le champ user_id de l'enregistrement Post à 5. Lorsque je supprime l'association, le code ci-dessus fonctionne.

Existe-t-il un moyen de mettre à jour le champ user_id sans supprimer l'association?

Merci!

Tim

+0

Cela devrait fonctionner, bien qu'il soit inhabituel d'attribuer un ID directement. Avez-vous un message d'erreur? – zetetic

+0

L'utilisateur avec id = 5 existe-t-il? – hade

+0

Oui, l'utilisateur avec l'ID 5 existe. Et je ne reçois pas de message d'erreur. Quand j'essaye ceci dans la console, c'est vrai. Mais l'id_utilisateur ne change pas. – Tim

Répondre

1

Vous avez écrit:

Ces exemples ressemblent, ils devraient travailler, mais pour une raison quelconque le user_id reste inchangé. Peut-être qu'il a quelque chose à voir avec les validations

Vous pouvez facilement vérifier si elle est due à des validations en remplaçant "save" avec "save!"

L'ancien juste retourne faux si l'un des tests échouent, alors que celui-ci soulèvera une exception:

p = Post.find(1) 
p.user = User.find(5) 
p.save! 

Alternativement, vous pouvez également effectuer les opérations suivantes dans une console Rails:

>> p = Post.find(1) 
... 
>> p.user = User.find(5) 
... 
>> p.valid? 
... 
>> # will be either true or false, depending on validations 
>> p.errors.full_messages 
... 
>> # will be either [] or else a non-empty array of all validation failures 
>> _ 

Bonne chance!

1

La façon « correcte » de le faire est de laisser faire tout le Rails lourds de levage, comme suit:

p = Post.find(1) 
p.user = User.find(5) 
p.save 

... qui travaillera, en supposant que toutes les validations sont remplies .

Autre possibilité:

Post.find(1).update_attribute(:user_id, 5) 

... bien que vous voulez sans doute réfléchir à deux fois avant d'utiliser ce dernier! :-)

Peter

+0

Merci pour la réponse. Ces exemples semblent devoir fonctionner, mais pour une raison quelconque, id_utilisateur reste inchangé. Peut-être que cela a quelque chose à voir avec les validations – Tim