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