J'ai deux modèles: utilisateur et entreprise. Ils sont créés à partir d'une forme et j'utilise une transaction comme ceci: L'utilisateur est enregistré dans la base de données même lorsque l'une des validations de la société échoue. J'ai essayé d'ajouter une manipulation d'erreurs explicite d'Actionecord :: recordinvalid mais cela n'a pas aidé. Je pensais que la validation augmenterait l'erreur de retourner la transaction de toute façon. Toute aide est grandement appréciée. P> merci p> p>
5 Réponses :
http://temppe.st/2007/05/transaction-in- rails / p>
Je pense que vous devez utiliser un bloc de fin de départ en dehors de la boucle de transaction. P>
Pas vrai. Si vous voulez faire quelque chose de plus qu'un simple annulement, vous aurez besoin d'un commencez par code> ..
sauvetage code> ..
fin code> bloc, mais une exception Hangler Plus haut en haut de la pile peut tout aussi facilement le gérer après la restauration. Vous pouvez également laisser les rails le gérer et montrer une page d'erreur.
Vous devrez considérer ces scénarios
Par exemple, si vous n'avez qu'une relation individuelle, elle peut être traitée de manière plus optimisée p> maintenant, dans la société Modèle p> Je n'ai pas testé comme exemple. Juste de mon esprit.
Ai-je compris le problème correctement? P> p>
Vous devez utiliser un moteur de base de données prenant en charge les transactions acides. Pour MySQL qui est innodb.
ALTER TABLE <table name> ENGINE INNODB;
N'attribuez pas d'une exception ActiveRecord :: RecordInvalid d'une transaction, car cette exception invalide la transaction sur certaines bases de données telles que Postgres. Une fois que la transaction a été invalidée, vous devez le redémarrer depuis le début pour fonctionner correctement. markdaggett.com/blog/2011/12/01/transactions-in -Rails
sauvegarder () et détruire () sont toujours sous transaction (voir http://railapi.com/doc/rails-v2.3.5/classes/activerecord/transactions/classmethods.html ).
Ce que je pense que tu veux faire est p >
begin @company = Company.create!(params[:company]) @user = User.create!(params[:user]) { |user| user.company => @company } rescue => ex # ... handle your validation errors end
Tentative d'enregistrement d'une nouvelle entrée et de réviser une entrée existante (basée sur la nouvelle entrée) en même temps, a rencontré un problème similaire. Essayé Transaction avec la validation de la sauvetage échoué, mais réglé sur cela à la place:
if @new_entry.valid? && @existing_entry.valid? ActiveRecord::Base.transaction do @new_entry.save! @existing_entry.save! end end
Quels RDBM utilisez-vous? Cela prend-il en charge les transactions (myisam vs InnoDB)?
Ah, je pense que c'est ça. La plupart des tables sont innodry, mais il y a des myisam. Merci
Voir aussi Stackoverflow.com/questions/2481806/...