11
votes

La transaction Rails ne revient pas à une erreur de validation

J'ai deux modèles: utilisateur et entreprise. Ils sont créés à partir d'une forme et j'utilise une transaction comme ceci: xxx

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.

merci


3 commentaires

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/...


5 Réponses :


-3
votes

http://temppe.st/2007/05/transaction-in- rails /

Je pense que vous devez utiliser un bloc de fin de départ en dehors de la boucle de transaction.


1 commentaires

Pas vrai. Si vous voulez faire quelque chose de plus qu'un simple annulement, vous aurez besoin d'un commencez par .. sauvetage .. fin 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.



0
votes

Vous devrez considérer ces scénarios

  1. Utilisez un système de base de données prenant en charge la transaction
  2. re-facteur que le code d'une approche plus logique

    Par exemple, si vous n'avez qu'une relation individuelle, elle peut être traitée de manière plus optimisée xxx

    maintenant, dans la société Modèle xxx

    Je n'ai pas testé comme exemple. Juste de mon esprit. Ai-je compris le problème correctement?


0 commentaires

2
votes

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;


1 commentaires

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



0
votes

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


0 commentaires

2
votes

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


0 commentaires