264 votes

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

Les 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 mixte, 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 est: 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.

342voto

Salil Points 20300

Hey s'il vous plaît se référer à l' update_attribute. En cliquant sur afficher la source vous obtiendrez le code suivant

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614:       def update_attribute(name, value)
2615:         send(name.to_s + '=', value)
2616:         save(false)
2617:       end

et maintenant se référer update_attributes et de regarder son code, vous obtenez

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621:       def update_attributes(attributes)
2622:         self.attributes = attributes
2623:         save
2624:       end

la différence entre les deux est - update_attribute utilise save(false) alors qu' update_attributes utilise save ou vous pouvez dire save(true).

Désolé pour la description longue, mais ce que je veux dire, c'est important. save(perform_validation = true), si perform_validation est faux qu'il ignore (bennes sera le bon mot) toutes les validations assosciated avec save.

Pour la deuxième question

Aussi, quelle est la bonne syntaxe pour passer d'un hachage pour update_attributes... découvrez mon exemple au dessus.

Votre exemple est correct.

Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")

ou

Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"

ou si vous obtenez tous les champs de données et le nom dans une table de hachage dire params[:user] ici utiliser juste

Object.update_attributes(params[:user])

75voto

Matt Points 639

Astuce :est actuellement déconseillée dans 4 Rails par le biais de [commettre a7f4b0a1](https://github.com/rails/rails/commit/a7f4b0a1231bf3c65db2ad4066da78c3da5ffb01). Elle supprime en faveur de `` .

17voto

update_attribute

Cet attribut unique de mise à jour de méthode d’objet sans appel modèle base de validation.

update_attributes

Cette méthode mise à jour de plusieurs attribut d’objet unique et également passer la validation des modèles de base.

Espérons que cette réponse sera clair sur quand utiliser quelle méthode de l’enregistrement actif.

13voto

Kibet Yegon Points 921

Également à noter est que, avec , l’attribut de votre choix à mettre à jour n’a pas besoin d’être blanc assorties d’une mise à jour par opposition à la méthode de cession massive qui mettra à jour uniquement a spécifié les attributs.

4voto

rogerdpack Points 12806

Pour répondre à votre question, update_attribute saute pré enregistrer « validations » mais il fonctionne encore comme tous les autres rappels `` etc. Donc si vous voulez vraiment « juste mettre à jour la colonne et sautez tout cruft AR » puis vous devez utiliser (apparemment)

``Voir http://stackoverflow.com/a/7243777/32453

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X