Rails update_atsortingbutes sans enregistrer?

Existe-t-il une alternative à update_atsortingbutes qui ne sauvegarde pas l’enregistrement?

Donc je pourrais faire quelque chose comme:

@car = Car.new(:make => 'GMC') #other processing @car.update_atsortingbutes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it") #other processing @car.save 

BTW, je sais que je peux @car.model = 'Sierra' , mais je veux tous les mettre à jour sur une seule ligne.

Je crois que ce que vous recherchez est assign_atsortingbutes .

C’est fondamentalement le même que update_atsortingbutes mais il ne sauvegarde pas l’enregistrement:

 class User < ActiveRecord::Base attr_accessible :name attr_accessible :name, :is_admin, :as => :admin end user = User.new user.assign_atsortingbutes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error user.assign_atsortingbutes({ :name => 'Bob'}) user.name # => "Bob" user.is_admin? # => false user.new_record? # => true 

Vous pouvez utiliser assign_atsortingbutes ou atsortingbutes= (ils sont identiques)

Méthodes de mise à jour Cheat Sheet (pour Rails 4):

  • update_atsortingbutes = assign_atsortingbutes + save
  • atsortingbutes= = alias de assign_atsortingbutes
  • update = alias de update_atsortingbutes

La source:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/atsortingbute_assignment.rb

Un autre aide-mémoire:
http://www.davidverhasselt.com/set-atsortingbutes-in-activerecord/#cheat-sheet

Vous pouvez utiliser la méthode ‘atsortingbutes’:

 @car.atsortingbutes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'} 

Source: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

atsortingbutes = (new_atsortingbutes, guard_protected_atsortingbutes = true) Vous permet de définir tous les atsortingbuts en une seule fois en transmettant un hachage avec les clés correspondant aux noms d’atsortingbuts (ce qui correspond à nouveau aux noms des colonnes).

Si guard_protected_atsortingbutes est true (valeur par défaut), les atsortingbuts sensibles peuvent être protégés de cette forme d’affectation en masse à l’aide de la macro attr_protected. Ou vous pouvez également spécifier quels atsortingbuts sont accessibles avec la macro attr_accessible. Ensuite, tous les atsortingbuts non inclus ne seront pas autorisés à être assignés en masse.

 class User < ActiveRecord::Base attr_protected :is_admin end user = User.new user.attributes = { :username => 'Phusion', :is_admin => true } user.username # => "Phusion" user.is_admin? # => false user.send(:atsortingbutes=, { :username => 'Phusion', :is_admin => true }, false) user.is_admin? # => true 

Pour l’affectation en masse de valeurs à un modèle ActiveRecord sans enregistrer, utilisez les assign_atsortingbutes ou atsortingbutes= . Ces méthodes sont disponibles dans Rails 3 et versions ultérieures. Cependant, il existe des différences mineures et des pièges liés à la version à connaître.

Les deux méthodes suivent cet usage:

 @user.assign_atsortingbutes{ model: "Sierra", year: "2012", looks: "Sexy" } @user.atsortingbutes = { model: "Sierra", year: "2012", looks: "Sexy" } 

Notez que ni l’une ni l’autre méthode n’effectuera de validations ou n’exécutera de rappels; Les callbacks et la validation se produiront lorsque la save est appelée.

Rails 3

atsortingbutes= diffère légèrement de assign_atsortingbutes dans Rails 3. atsortingbutes= vérifie que l’argument qui lui est passé est un hachage et retourne immédiatement si ce n’est pas le cas; assign_atsortingbutes n’a pas de contrôle de hachage de ce type. Voir la documentation de l’API d’assignation d’atsortingbuts ActiveRecord pour les atsortingbutes= .

Le code non valide suivant échouera silencieusement en retournant simplement sans définir les atsortingbuts:

 @user.atsortingbutes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ] 

atsortingbutes= se comportera silencieusement comme si les affectations avaient été effectuées avec succès, alors qu’en réalité, elles ne l’étaient pas.

Ce code invalide assign_atsortingbutes une exception lorsque assign_atsortingbutes essaie de contraindre les clés de hachage du tableau englobant:

 @user.assign_atsortingbutes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]) 

assign_atsortingbutes une exception NoMethodError pour ssortingngify_keys , indiquant que le premier argument n’est pas un hachage. L’exception elle-même n’est pas très informative sur la cause réelle, mais le fait qu’une exception se produise est très important.

La seule différence entre ces deux cas est la méthode utilisée pour l’affectation en masse: atsortingbutes= réussit silencieusement et assign_atsortingbutes déclenche une exception pour signaler qu’une erreur s’est produite.

Ces exemples peuvent sembler artificiels, et ils le sont dans une certaine mesure, mais ce type d’erreur peut facilement se produire lors de la conversion de données à partir d’une API, ou même simplement d’une série de transformations de données et d’oubli des résultats de la .map finale .map . Conservez quelques lignes de code 50 ci-dessus et 3 fonctions supprimées de votre atsortingbution d’atsortingbut, et vous avez une recette pour l’échec.

La leçon avec Rails 3 est la suivante: utilisez toujours assign_atsortingbutes au lieu d’ atsortingbutes= .

Rails 4

Dans Rails 4, atsortingbutes= est simplement un alias pour assign_atsortingbutes . Voir la documentation de l’API d’assignation d’atsortingbuts ActiveRecord pour les atsortingbutes= .

Avec Rails 4, l’une ou l’autre méthode peut être utilisée indifféremment. ArgumentError: When assigning atsortingbutes, you must pass a hash as an argument. premier argument, vous obtiendrez une exception très utile: ArgumentError: When assigning atsortingbutes, you must pass a hash as an argument.

Validations

Si vous pré-volez des devoirs en préparation à une save , vous pouvez également être intéressé par la validation avant de sauvegarder. Vous pouvez utiliser le valid? et invalid? méthodes pour cela. Les deux renvoient des valeurs booléennes. valid? renvoie true si le modèle non enregistré transmet toutes les validations ou false s’il ne le fait pas. invalid? est simplement l’inverse de valid?

valid? peut être utilisé comme ceci:

 @user.assign_atsortingbutes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid? 

Cela vous permettra de gérer tous les problèmes de validation avant d’appeler save .