Rails: update_atsortingbute vs update_atsortingbutes

Object.update_atsortingbute(:only_one_field, "Some Value") Object.update_atsortingbutes(:field1 => "value", :field2 => "value2", :field3 => "value3") 

Les deux mettront à jour un object sans avoir à indiquer explicitement à AR de mettre à jour.

L’API Rails dit:

pour update_atsortingbute

Met à jour un seul atsortingbut et enregistre 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 habituelle update_atsortingbute dans Base est remplacée par cette méthode lorsque le module de validation est mélangé, ce qui est le cas par défaut.

pour update_atsortingbutes

Met à jour tous les atsortingbuts du hachage transmis et enregistre l’enregistrement. Si l’object n’est pas valide, l’enregistrement échouera et false sera renvoyé.

Donc, si je ne veux pas que l’object soit validé, je devrais utiliser update_atsortingbute. Que se passe-t-il si j’ai cette mise à jour sur une before_save?

Ma question est la suivante: update_atsortingbute ignore-t-il également la sauvegarde avant ou seulement la validation?

En outre, quelle est la syntaxe correcte pour passer un hachage à update_atsortingbutes … consultez mon exemple en haut.

Veuillez vous référer à update_atsortingbute . 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_atsortingbute(name, value) 2615: send(name.to_s + '=', value) 2616: save(false) 2617: end 

et maintenant référencer update_atsortingbutes et regarder son code que vous obtenez

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

La différence entre les deux est update_atsortingbute utilise save(false) alors que update_atsortingbutes utilise save ou vous pouvez dire save(true) .

Désolé pour la description longue mais ce que je veux dire est important. save(perform_validation = true) , si perform_validation est fausse, il contourne (saute sera le mot correct) toutes les validations associées à save .

Pour la deuxième question

En outre, quelle est la syntaxe correcte pour passer un hachage à update_atsortingbutes … consultez mon exemple en haut.

Votre exemple est correct.

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

ou

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

ou si vous obtenez tous les champs data et name dans un hash, dites params[:user] ici utilisez juste

 Object.update_atsortingbutes(params[:user]) 

Astuce: update_atsortingbute est obsolète dans Rails 4 via Commit a7f4b0a1 . Il supprime update_atsortingbute en faveur de update_column .

update_atsortingbute

Cette méthode met à jour l’atsortingbut unique de l’object sans appeler la validation basée sur le modèle.

 obj = Model.find_by_id(params[:id]) obj.update_atsortingbute :language, “java” 

update_atsortingbutes

Cette méthode met à jour plusieurs atsortingbuts d’un object unique et permet également la validation basée sur un modèle.

 atsortingbutes = {:name => “BalaChandar”, :age => 23} obj = Model.find_by_id(params[:id]) obj.update_atsortingbutes(atsortingbutes) 

J’espère que cette réponse sera claire quand utiliser quelle méthode d’enregistrement actif.

Notez également qu’avec update_atsortingbute , l’atsortingbut souhaité à mettre à jour n’a pas besoin d’être blanc avec attr_accessible pour le mettre à jour par opposition à la méthode d’assignation en masse update_atsortingbutes qui ne mettra à jour que les attr_accessible spécifiés attr_accessible .

Bonnes réponses remarquez que pour ruby ​​1.9 et supérieur, vous pourriez (et je pense que vous devriez) utiliser la nouvelle syntaxe de hachage pour update_atsortingbutes:

 Model.update_atsortingbutes(column1: "data", column2: "data") 

update_atsortingbute met simplement à jour un seul atsortingbut d’un modèle, mais nous pouvons transmettre plusieurs atsortingbuts dans la méthode update_atsortingbutes .

Exemple:

 user = User.last #update_atsortingbute user.update_atsortingbute(:status, "active") 

Il passe la validation

 #update_atsortingbutes user.update_atsortingbutes(first_name: 'update name', status: "active") 

il ne se met pas à jour si la validation échoue.

Vous pourriez être intéressé par cette publication sur toutes les manières possibles d’atsortingbuer un atsortingbut ou un enregistrement de mise à jour (mis à jour à Rails 4) update_atsortingbute, update, update_column, update_columns etc. http://www.davidverhasselt.com/set-atsortingbutes- in-activerecord / . Par exemple, il diffère sur des aspects tels que l’exécution de validations, le contact avec l’object updated_at ou le déclenchement de rappels.

En réponse à la question du PO, update_atsortingbute ne update_atsortingbute pas les callbacks.

Pour répondre à votre question, update_atsortingbute ignore les “validations” de pré-enregistrement, mais il exécute toujours d’autres callbacks comme after_save etc. Donc, si vous voulez vraiment “mettre à jour la colonne et ignorer toute AR”, vous devez utiliser (apparemment)

Model.update_all(...) voir https://stackoverflow.com/a/7243777/32453

Récemment, j’ai rencontré update_atsortingbute vs update_atsortingbutes et un problème de validation, des noms très similaires, donc un comportement si différent, si déroutant.

Pour passer le hash à update_atsortingbute et contourner la validation, vous pouvez faire:

 object = Object.new object.atsortingbutes = { field1: 'value', field2: 'value2', field3: 'value3' } object.save!(validate: false) 

update_atsortingbute et update_atsortingbutes sont similaires, mais avec une grande différence: update_atsortingbute n’exécute pas les validations.

Aussi:

  • update_atsortingbute est utilisé pour mettre à jour l’enregistrement avec un seul atsortingbut.

     Model.update_atsortingbute(:column_name, column_value1) 
  • update_atsortingbutes est utilisé pour mettre à jour l’enregistrement avec plusieurs atsortingbuts.

     Model.update_atsortingbutes(:column_name1 => column_value1, :column_name2 => column_value2, ...) 

Ces deux méthodes sont vraiment faciles à confondre compte tenu de leurs noms et de leurs travaux similaires. Par conséquent, update_atsortingbute est supprimé en faveur de update_column .

Maintenant, dans Rails4, vous pouvez utiliser Model.update_column(:column_name, column_value) à l’emplacement de Model.update_atsortingbute(:column_name, column_value)

Cliquez ici pour obtenir plus d’informations sur update_column .

Je pense que votre question est de savoir si un atsortingbut update_atsortingbute dans un before_save entraînera une boucle sans fin (des appels update_atsortingbute dans les rappels before_save, déclenchés à l’origine par un appel update_atsortingbute)

Je suis sûr que cela contournera le rappel before_save car il ne sauvegarde pas réellement l’enregistrement. Vous pouvez également enregistrer un enregistrement sans déclencher de validations en utilisant

Model.save false