Recherche…


Introduction

Les transactions ActiveRecord sont des blocs protecteurs où la séquence des requêtes d'enregistrement actives n'est permanente que si elles peuvent toutes réussir en une seule action atomique.

Premiers pas avec les transactions d'enregistrement actives

Les transactions d'enregistrement actives peuvent être appliquées aux classes de modèle ainsi qu'aux instances de modèle. Les objets du bloc de transaction ne doivent pas nécessairement tous être des instances de la même classe. Cela est dû au fait que les transactions sont par connexion à la base de données, et non par modèle. Par exemple:

User.transaction do
  account.save!
  profile.save!
  print "All saves success, returning 1"
  return 1
end
rescue_from ActiveRecord::RecordInvalid do |exception|
  print "Exception thrown, transaction rolledback"
  render_error "failure", exception.record.errors.full_messages.to_sentence
end

L'utilisation de save with a bang garantit que la transaction sera automatiquement annulée lorsque l'exception est lancée et après la restauration, le contrôle passe au bloc de secours pour l'exception. Assurez-vous de sauver les exceptions lancées lors de la sauvegarde! dans le bloc de transaction.

Si vous ne voulez pas utiliser save !, vous pouvez manuellement relancer raise ActiveRecord::Rollback lorsque la sauvegarde échoue. Vous n'avez pas besoin de gérer cette exception. Il annulera alors la transaction et amènera le contrôle à l'instruction suivante après le bloc de transaction.

   User.transaction do
      if account.save && profile.save
        print "All saves success, returning 1"
        return 1
      else
        raise ActiveRecord::Rollback
      end
    end
    print "Transaction Rolled Back"


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow