2012-10-17 5 views
3

Y a-t-il un remplacement pour update_attribute? Je sais que vous pouvez toujours l'utiliser dans Rails 3 mais vous recevez des messages d'obsolescence.Rails update_attribute remplacement?

La raison pour laquelle j'ai besoin d'utiliser update_attribute est que j'ai besoin d'ignorer les validations mais d'exécuter des rappels.

La seule façon que je l'ai trouvé de le faire (et éviter les messages de désapprobation), est en extrayant simplement le code de update_attribute:

Object.send("#{attribute}=", value) 
Object.save(:validate => false) 

Je voudrais savoir s'il y a un autre (bon) façon de le faire.

Merci.

+0

La seule façon d'exécuter des rappels sans validation que j'ai vu est de passer ': validate => false' à l'appel de sauvegarde. C'est * la bonne façon. Si vous n'avez pas besoin de validations ou de rappels, vous devez utiliser 'update_column'. Si vous voulez mettre à jour beaucoup d'enregistrements ET ignorer les validations ET ignorer les rappels, alors vous voulez 'Model.update_all'. –

+0

J'ai mis à jour ma réponse. Je suppose que maintenant ça peut aider. – ck3g

Répondre

3

Je suggère quelle est la réponse pas.

Vous ne pouvez pas passer false à update_attributes pour ignorer la validation. Je recommanderais update_column, mais cette méthode ignore les rappels. Et à en juger par votre question, ce n'est pas ce dont vous avez besoin.

Mise à jour:

J'ai trouvé intéressant dans la table that presentation. Je suppose que cela peut prouver mon opinion.

update_(attribute|column)s

A en juger par ce tableau il n'y a qu'une seule méthode qui satisfait aux conditions.

-1

De l'validations documentation:

Le processus de validation de sauvegarde peut être sautées en passant: valider => false. La méthode #save régulière est remplacée par ceci quand le module de validations est mixé, ce qui est par défaut.

Définissez simplement votre attribut sur la valeur correcte et appelez save avec le paramètre validates défini sur false. Vous n'avez pas besoin d'utiliser send, non plus, sauf si vous avez du code qui repose sur la métaprogrammation, mais ce n'est pas évident dans votre exemple.

object.attribute = value 
object.save(:validate => false) 
+0

Je ne comprends pas la downvote ici. Bien que ce ne soit probablement pas une bonne idée d'ignorer la validation (sauf si votre validation est incorrecte *), c'est un moyen efficace d'ignorer cette étape du flux de travail de persistance. * C'est un drapeau rouge, pour moi. Les validations sont là pour une raison! –

Questions connexes