2009-03-14 11 views
4

J'essaie de mettre à jour un de mes objets dans l'application Rails et les modifications ne tiennent pas. Il n'y a pas d'erreur, et le fait de passer par le débogueur révèle simplement qu'il pense que tout est en train de se mettre à jour.Enregistrement des mises à jour d'objets dans les rails

Quoi qu'il en soit, voici le code en question ...

qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id]) 
    qm.position = x 
    qm.save 

Pour des raisons de référence, QuestionMembership a question_id, form_id et champs de position. Tous sont des entiers et n'ont pas de contraintes db.

C'est fondamentalement ma table de jointure entre des formes et des questions. En parcourant le code, qm obtient un objet valide, la position de l'objet est changée en valeur de x, et save retourne 'true'. Cependant, après la sortie de la méthode, l'objet dans la base de données est inchangé.

Qu'est-ce qui me manque?

+0

Qu'est-qm.save! revenir? –

Répondre

0

Il s'avère qu'il émettait le mauvais SQL. Fondamentalement, il cherchait l'objet QuestionMembeship par la colonne id qui n'existe pas. J'ai eu l'impression que cette colonne était inutile avec has_many_through relations, bien qu'il semble que j'étais égaré.

Pour corriger, j'ai simplement ajouté la colonne id à la table en tant que clé primaire. Merci pour tous les conseils.

0

Essayez de remplacer qm.save par qm.save! et voyez si vous obtenez un message d'exception.

Éditer: Que se passe-t-il lorsque vous regardez le journal sur l'appel de .save !? Génère-t-il le SQL attendu?

+0

Même résultat. Je suis confus, c'est le moins qu'on puisse dire. –

+0

Je suis Thomas, ravi de vous rencontrer, confus! ;) – Thomas

+0

Que se passe-t-il lorsque vous regardez le journal de l'appel à .save !?Génère-t-il le SQL attendu? –

0

Quel est le résultat de qm.save? Vrai ou faux? Et qu'en est-il de qm.errors, cela vous donne-t-il quelque chose de logique? Et que dit le journal de développement?

8

Vous ne trouvez peut-être pas l'objet que vous pensez être. Certaines expériences en IRB pourraient être éclairantes.

Aussi, en règle générale lors du changement un seul attribut, il est préférable d'écrire

qm.update_attribute(:position, x) 

au lieu de définir et d'économie. Rails mettra alors à jour uniquement cette colonne au lieu de la ligne entière. Et vous bénéficiez également des données qui sont nettoyées.

0

J'ai souvent rencontré ce problème. (J'étais sur le point de dire constamment, mais je ne peux pas, car cela impliquerait que je saurais quand il allait arriver.)

Bien que je n'ai pas de solution au problème sous-jacent, j'ai trouvé que cela semblait se produire pour moi seulement quand j'essaie de mettre à jour les champs mysql text. Ma solution a été de définir le champ de faire quelque chose comme:

qm.position = "" 
qm.save 
qm.position = x 
qm.save 

Et pour répondre à tout le monde ... quand je lance qm.save! je reçois aucune erreur. Je n'ai pas essayé qm.save?

Quand je cours mon code dans la console de rails tout fonctionne parfaitement comme en témoigne la recherche de l'objet en utilisant la même requête apporte les résultats attendus.

J'ai le même problème lors de l'utilisation qm.update_attribute(... ainsi

Ma solution m'a obtenu boitant loin, mais nous espérons que quelqu'un sur ce fil sera en mesure d'aider.

1

Y a-t-il un after_save?

Le code SQL correct est-il émis?

+0

Wrong SQL sort. Ce qu'il fait sortir est: UPDATE "question_memberships" SET "position" = 3, "updated_at" = '2009-03-17 19:09:44' WHERE "id" = NULL Puisqu'il s'agit d'une table de jointure , il n'y a pas de champ "id". Retour à la planche à dessin. Je pensais que les tables jointes n'aimaient pas les champs id. –

+0

Je suppose que les rails ne savent pas qu'il ne devrait pas s'attendre à un ID. Je vérifie les instructions has_many, belongs_to, et cetera dans les classes Question, Membership et QuestionMembership. – wombleton

+0

Cochez cette case http://stackoverflow.com/questions/522408/how-to-manage-table-without-id-in-rails: il se peut que vous recherchiez has_and_belongs_to_many à la place de la jointure plus "moderne". as-full-object. – wombleton

1

Dans le journal de développement, vous pouvez réellement voir le SQL qui est généré.

Pour quelque chose comme ceci:

qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id]) 
qm.position = x 
qm.save 

Vous devriez voir quelque chose à l'effet de:

SELECT * FROM question_memberships WHERE question_id=2 AND form_id=6 LIMIT 1 
UPDATE question_memberships SET position = x WHERE id = 5 

Pouvez-vous sortie ce que sql vous voyez réellement que nous pouvons comparer?

0

Utilisez ./script/console et exécuter ce script .. étape par étape ..

voir si le champ de position de l'objet est mise à jour ou pas lorsque vous exécutez la ligne 2

puis appuyez sur qm. enregistrer ou qm.save! ... pour tester

voir ce qui se passe. En outre, comme mentionné par Tim .. vérifier les journaux

0

Vérifiez votre classe QuestionMembership et vérifiez que la position n'a pas quelque chose comme

attr_readonly :position 

La meilleure façon de déboguer est de faire

tail -f log/development.log 

Et puis ouvrez une autre console et exécutez le code exécutant l'instruction save. Vérifiez que l'instruction SQL Update réelle est exécutée.

0

Vérifiez que les paramètres de votre base de données sont corrects. Si vous travaillez avec plusieurs bases de données (ou si vous n'avez pas changé la base de données sqlite3 par défaut en MySQL), vous pouvez utiliser la mauvaise base de données.

Exécutez les commandes dans ./script/console pour voir si vous voyez le même comportement.

Vérifiez qu'un objet similaire (par exemple, un formulaire ou une question) est enregistré.

Si le formulaire ou la question est enregistré, recherchez la différence entre l'objet QuestionMembership et l'objet Formulaire ou Question.

1

soit mettre à jour l'attribut ou appelez:

qm.reload 

après la qm.save

Questions connexes