Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Les deux mettront à jour un objet sans avoir à dire explicitement à AR de mettre à jour.
L'API Rails dit:
pour update_attribute
Met à jour un seul attribut et sauvegarde l'enregistrement sans passer par la procédure de validation normale. Ceci est particulièrement utile pour les indicateurs booléens sur les enregistrements existants. La méthode régulière update_attribute dans Base est remplacée par ceci lorsque le module de validations est mélangé, ce qui est par défaut.
pour update_attributes
Met à jour tous les attributs du hachage transmis et enregistre l'enregistrement. Si l'objet n'est pas valide, l'enregistrement échouera et false sera renvoyé.
Donc, si je ne veux pas faire valider l'objet, je dois utiliser update_attribute. Que se passe-t-il si j'ai cette mise à jour sur un before_save?
Ma question est la suivante: update_attribute contourne également la sauvegarde avant ou juste la validation.
En outre, quelle est la syntaxe correcte pour passer un hachage à update_attributes ... consultez mon exemple en haut.
la source
update_attribute
déclaration dans unbefore_save
rappel? Je ne vois pas de bonne raison à cela.before_save
rappel). Fe au lieu deupdate_attribute(:discount, 0.1) if amount > 100
vous pourrait fairediscount = 0.1 if amount > 100
.update_attribute
appellesave
l'objet, ce qui n'est pas nécessaire dans ce cas, car l'instruction se trouve dans unbefore_save
rappel et sera quand même enregistrée. J'espère que cela à du sens.Réponses:
Veuillez vous référer à
update_attribute
. En cliquant sur show source, vous obtiendrez le code suivantet maintenant référez
update_attributes
- vous et regardez son code que vous obtenezla différence entre deux est les
update_attribute
utilisationssave(false)
alors que lesupdate_attributes
utilisationssave
ou vous pouvez diresave(true)
.Désolé pour la longue description mais ce que je veux dire est important.
save(perform_validation = true)
, siperform_validation
est faux, il contourne (les sauts seront le mot approprié) toutes les validations associéessave
.Pour la deuxième question
Votre exemple est correct.
ou
ou si vous obtenez tous les champs données et nom dans un hachage, dites
params[:user]
ici, utilisez simplementla source
Rails 3
. Il est dit très clairement dans les commentaires de la source que "les rappels sont invoqués".update_attributes
est maintenant un alias pourupdate
Astuce:
update_attribute
est obsolète dans Rails 4 via Commit a7f4b0a1 . Il supprimeupdate_attribute
en faveur deupdate_column
.la source
update_attribute
ignore la validation, mais respecte les rappels,update_column
ignorera la validation et les rappels et ne mettra pas à jour:updated_at
,update
est la fonction normale qui respectera à la fois les rappels et la validationupdate_column
n'est pas déconseillé, maisupdate_columns(name: value)
est favorisé.reset_column
a été retiré.update_attribute
Cette méthode met à jour un seul attribut d'objet sans invoquer la validation basée sur un modèle.
update_attributes
Cette méthode met à jour plusieurs attributs d'un seul objet et passe également la validation basée sur le modèle.
J'espère que cette réponse éclaircira quand utiliser quelle méthode d'enregistrement actif.
la source
Il convient également de noter qu'avec
update_attribute
, l'attribut à mettre à jour n'a pas besoin d'être mis en liste blanche avecattr_accessible
pour le mettre à jour, contrairement à la méthode d'affectation en masseupdate_attributes
qui ne mettra à jourattr_accessible
que les attributs spécifiés.la source
update_attribute
met simplement à jour un seul attribut d'un modèle, mais nous pouvons passer plusieurs attributs dans laupdate_attributes
méthode.Exemple:
Il passe la validation
il ne se met pas à jour si la validation échoue.
la source
Excellentes réponses. notez que comme pour ruby 1.9 et supérieur, vous pouvez (et je pense que vous devriez) utiliser la nouvelle syntaxe de hachage pour update_attributes:
la source
Vous pourriez être intéressé à visiter ce billet de blog concernant toutes les façons possibles d'attribuer un attribut ou un enregistrement de mise à jour (mis à jour vers Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Par exemple, il diffère par des aspects tels que l'exécution de validations, le fait de toucher l'objet updated_at ou le déclenchement de rappels.Comme une réponse à la question du PO
update_attribute
ne passe pas par des rappels.la source
update_attribute
etupdate_attributes
sont similaires, mais avec une grande différence:update_attribute
ne lance pas les validations.Aussi:
update_attribute
est utilisé pour mettre à jour l'enregistrement avec un seul attribut.update_attributes
est utilisé pour mettre à jour l'enregistrement avec plusieurs attributs.Ces deux méthodes sont vraiment faciles à confondre étant donné leurs noms et travaux similaires. Par conséquent,
update_attribute
est supprimé en faveur deupdate_column
.Maintenant, dans Rails4, vous pouvez utiliser
Model.update_column(:column_name, column_value)
à l'endroit deModel.update_attribute(:column_name, column_value)
Cliquez ici pour obtenir plus d'informations sur
update_column
.la source
Pour répondre à votre question,
update_attribute
ignore les "validations" de pré-sauvegarde, mais il exécute toujours tous les autres rappels commeafter_save
etc.Model.update_all(...)
voir https://stackoverflow.com/a/7243777/32453la source
Récemment , je suis tombé sur
update_attribute
contreupdate_attributes
et problème de validation, si des noms similaires, si différents comportements, confusion.Pour passer le hachage
update_attribute
et contourner la validation, vous pouvez faire:la source
Je pense que votre question est de savoir si avoir un update_attribute dans un before_save conduira à une boucle sans fin (des appels update_attribute dans les rappels before_save, initialement déclenchés par un appel update_attribute)
Je suis presque sûr qu'il contourne le rappel before_save car il ne sauvegarde pas réellement l'enregistrement. Vous pouvez également sauvegarder un enregistrement sans déclencher de validation en utilisant
Model.save false
la source