Rails: update_attribute vs update_attributes
Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Ces mise à jour d'un objet sans avoir à indiquer de façon explicite à l'AR de mise à jour.
Rails API dit:
pour update_attribute
Mises à jour d'un seul attribut et enregistre le dossier sans passer par la procédure de validation. Ceci est particulièrement utile pour les booléens drapeaux sur les enregistrements existants. Le régulier update_attribute méthode de Base est remplacé lors de la validation du module de mélange, qui est fait par défaut.
pour update_attributes
Les mises à jour de tous les attributs de le passé-de Hachage et enregistre le record. Si l'objet n'est pas valide, la sauvegarde échouera et sera retournée.
Donc si je ne veux pas avoir l'objet validé, je devrais utiliser update_attribute. Que faire si j'ai cette mise à jour sur un before_save, il stackoverflow?
Ma question c'est est-ce update_attribute également ignorer de l'avant de l'enregistrer ou tout simplement de la validation.
Aussi, quelle est la bonne syntaxe pour passer d'un hachage pour update_attributes... découvrez mon exemple au dessus.
- Pourquoi voulez-vous mettre un
update_attribute
énoncé à l'intérieur d'unbefore_save
de rappel? Je ne peux pas penser à une bonne raison pour cela. - J'ai des objets qui doivent être mis à jour en fonction de ce que la mise à jour de l'objet montant est. Quelle est la meilleure façon de faire?
- Suis-je en droit, que les objets que vous avez besoin de mettre à jour des attributs de l'objet que vous enregistrez? Si oui, alors vous pourriez tout simplement, et ils seront mis à jour avec l'objet qui est sauvé de toute façon (parce qu'ils sont définis à l'intérieur d'un
before_save
de rappel). F. e. au lieu deupdate_attribute(:discount, 0.1) if amount > 100
vous pourriez fairediscount = 0.1 if amount > 100
.update_attribute
appelssave
sur l'objet, ce qui est inutile dans ce cas, puisque la déclaration est à l'intérieur d'unbefore_save
de rappel et d'être sauvés de toute façon. J'espère qu'un sens. - Oui et non. Cependant, le statut des objets que vous faites référence est subordonnée à d'autres conditions qui ne peuvent pas être traitées avant de les enregistrer.
- comme une note, ces méthodes sauter de validation, mais toujours effectuer des rappels, comme after_save ...
Vous devez vous connecter pour publier un commentaire.
Veuillez vous référer à
update_attribute
. En cliquant sur afficher la source vous obtiendrez le code suivantet maintenant consulter
update_attributes
et de regarder son code, vous obtenezla différence entre les deux est
update_attribute
utiliseenregistrer le(faux)
alors queupdate_attributes
utiliseenregistrer
ou vous pouvez direenregistrer le(vrai)
.Désolé pour la description longue, mais ce que je veux dire, c'est important.
save(perform_validation = true)
, siperform_validation
est faux qu'il ignore (bennes sera le bon mot) tous les les validations associés àsave
.Pour la deuxième question
Votre exemple est correct.
ou
ou si vous obtenez tous les champs de données & nom dans une table de hachage dire
params[:user]
ici utiliser justeRails 3
. Il est dit très clairement dans les commentaires dans le source que "les Rappels sont invoqués".update_attributes
est maintenant un alias pourupdate
Astuce:
update_attribute
est déprécié dans les Rails 4 par l'intermédiaire de S'engager a7f4b0a1. Il supprimeupdate_attribute
en faveur deupdate_column
.update_attribute
ignore la validation, mais respecte les rappels,update_column
va passer à la fois de validation et de rappels et de l'habitude de mettre à jour:updated_at
,update
est la fonction normale qui respectera à la fois des rappels et de validationupdate_column
n'est pas obsolète, maisupdate_columns(name: value)
est favorisée.reset_column
a été supprimé.update_attribute
Cette méthode de mise à jour unique attribut de l'objet, sans invoquer le modèle en fonction de validation.
update_attributes
Cette méthode de mise à jour de plusieurs attributs de l'objet unique et aussi passer du modèle en fonction de validation.
Espère que cette réponse va effacer lors de l'utilisation de la méthode de l'enregistrement actif.
Également intéressant de noter, c'est qu'avec
update_attribute
, l'attribut souhaité être mise à jour n'a pas besoin d'être en liste blanche avecattr_accessible
de le mettre à jour, par opposition à la masse de la méthode d'affectation deupdate_attributes
qui ne mettra à jour queattr_accessible
attributs spécifiés.update_attribute
simplement les mises à jour qu'un attribut d'un modèle, mais on peut passer plusieurs attributs dansupdate_attributes
méthode.Exemple:
- Il passer la validation
elle n'est pas mise à jour si la validation échoue.
De grandes réponses.
notez que comme pour ruby 1.9 et au-dessus de vous pourrait (et devrait, à mon avis) utiliser la nouvelle valeur de hachage de la syntaxe pour update_attributes:
Vous pourriez être intéressé à visiter ce blog à propos de toutes les façons possibles pour attribuer un attribut ou mettre à jour l'enregistrement (mise à jour de Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/. Par exemple, il en diffère par des aspects tels que l'exécution de validations, de toucher de l'objet updated_at ou le déclenchement de rappels.Comme une réponse à la discussion de la question de
update_attribute
ne pas passer par les rappels.update_attribute
etupdate_attributes
sont similaires, maisavec une grande différence:
update_attribute
ne pas exécuter des validations.Aussi:
update_attribute
est utilisé pour mettre à jour l'enregistrement avec unique attribut.update_attributes
est utilisé pour mettre à jour l'enregistrement avec plusieurs attributs.Ces deux méthodes sont vraiment faciles à confondre donné leurs noms similaires et des œuvres. Par conséquent,
update_attribute
est supprimé en faveur deupdate_column
.Maintenant, dans Rails4 vous pouvez utiliser
Model.update_column(:column_name, column_value)
à la place deModel.update_attribute(:column_name, column_value)
Cliquez ici pour obtenir plus d'infos à propos de
update_column
.Pour répondre à votre question,
update_attribute
saute pré enregistrer "validations" mais il fonctionne toujours tout autre rappels commeafter_save
etc. Donc, si vous voulez vraiment "juste mettre à jour la colonne et ignorer tous les AR trucs", alors vous devez utiliser (apparemment)Model.update_all(...)
voir https://stackoverflow.com/a/7243777/32453Récemment, j'ai couru dans
update_attribute
vsupdate_attributes
et problème de validation, donc des noms semblables, si différents de comportement, si confus.Afin de passer de hachage pour
update_attribute
de dérivation et de validation que vous pouvez faire:Je pense que votre question est de savoir si avoir un update_attribute dans un before_save conduira à et boucle infinie (de update_attribute appels en before_save rappels, à l'origine, déclenchée par un update_attribute appel)
Je suis assez sûr qu'il ne contourner la before_save de rappel car il ne fait pas l'enregistrer. Vous pouvez également enregistrer un enregistrement sans déclenchement de validations par l'aide de
Modèle.enregistrer faux