Est-ce que le verbe reposé entier est sous une seule transaction englobante? C'est-à-dire, si je soulève une erreur dans la validation ou les rappels à n'importe quel point dans la manipulation d'une opération UPDATE, DELETE, ou CREATE, est-ce que chaque opération de base de données que j'ai exécutée dans les callbacks précédents est également annulée? En résumé, le fait de déclencher une erreur sur un callback ou une validation rend-il tel qu'aucun changement ne se produit dans la base de données pour cette action verbe?Quand les transactions commencent-elles en utilisant des rails (reposants)?
Répondre
Est-ce que le verbe reposful entier est sous une seule transaction englobante?
Pas
si je lève une erreur dans la validation ou callbacks à tout moment dans la manipulation d'un UPDATE, DELETE, ou une opération de création, est toutes les opérations de base de données que j'ai fait dans les précédents les rappels ont également été annulés?
n °
fait une erreur sur le soulevant tout rappel ou la validation faire de telle sorte qu'aucun changement du tout se produit dans la base de données pour cette action verbale?
No.
Si vous désirez ce problème, vous pouvez créer explicitement les transactions dans votre contrôleur (voir les exemples fournis par d'autres utilisateurs), ou utiliser un around_filter
pour attacher le comportement à toutes vos actions reposant.
Certaines méthodes (créer, détruire) vont immédiatement à la base de données. Les transactions ont lieu en utilisant la méthode de transaction sur les classes dérivées de ActiveRecord comme suit: (. Cet exemple concerne plusieurs bases de données pour une base de données unique, vous avez seulement besoin d'une transaction.)
Student.transaction do
Course.transaction do
course.enroll(student)
student.units += course.units
end
end
Vous pouvez rollback sur ces transactions, et les exceptions levées dans la transaction sont propagées après l'annulation.
Cela dépend de la base de données ayant des transactions. NB: sauvegarder et détruire sont enveloppés dans des transactions.
Par défaut, il n'y a pas de code de base de données écrit à l'intérieur d'une transaction, vous devez lui dire de le faire dans le code.
def create
Model.transaction do
Model.create!(params[:model])
Model.association.create!(params[:association])
end
rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
flash[:notice] = "That record could not be saved."
render :action => "new"
end
Utilisation du #create! Les méthodes tenteront de sauvegarder l'enregistrement et si elles échouent, elles déclencheront une exception qui annulera alors tout code déjà exécuté dans le bloc de transaction.
Si vous ne récupérez pas l'action, vous serez redirigé vers (je pense) un fichier 405.html dans votre répertoire public s'il en existe un.
Vous n'avez pas besoin d'imbriquer les transactions de cette manière. Tous les appels à .transaction sont passés à ActiveRecord :: Base. Vous appelez simplement ActiveRecord :: Base.transaction deux fois –
Ceci est un exemple de la documentation de rails. –
Ah! Je vois que c'est nécessaire pour plusieurs bases de données. Actualisé. –