2009/5/7 Cyril Mougel <[email protected]> > > ALAHYANE Rachid a écrit : > > Bonjour, > > > > Je suis entrain de développer une application dans laquelle j'ai > > besoin, à un moment donné, d'insérer plusieurs entrées dans une table: > > > > -------------------------------------------------- > > property.rb > > -------------------------------------------------- > > class Property < ActiveRecord::Base > > belongs_to :version > > validates_presence_of :name, :value > > validates_uniqueness_of :name, :scope => :version_id > > end > > -------------------------------------------------- > > la table associée à ce model contient les colonnes : id, name, value > > et version_id > > > > -------------------------------------------------- > > version.rb > > -------------------------------------------------- > > class Version < ActiveRecord::Base > > has_many :properties ,:dependent => :destroy #e.g ON CASCADE > > delete > > accepts_nested_attributes_for :properties,:allow_destroy => true > > end > > -------------------------------------------------- > > la table associée contient les colonnes : id et numero > > > > Le problème que j'ai est le suivant : lorsque j'insère via un > > formulaire associé à la version 1 par exemple > > > > prop1 de valeur p1 > > et > > prop1 de valeur p2 > > > > les deux entrées sont insérées dans la table properties, ici, je viole > > la contrainte validates_uniqueness_of, mais je ne reçois aucune > > erreur, et les entrées sont insérées :( Est-ce validates_uniqueness_of > > qui ne fonctionne pas bien ? ou bien j'ai autres chose à rajouter ? > > > > Si ma question n'est pas claire je peux la détailler encore. > > > Tu peux le détailler avec un test unitaire? Ca sera largement plus > simple a lire. > > C'est un débat courant avec ruby on rails : la validation d'uniqueness ne devrait pas être situé au niveau modèle, mais au niveau base de données sous forme de contrainte. C'est la seule façon de valider correctement ton unicité. Tu devrais déclarer un index unique sur la colone (ou son ensemble) que tu souhaites puis catcher l'exception levée en cas de violation de la contrainte (ActiveRecord::StatementInvalid). Enfin, vérifier qu'il s'agit bien de la contrainte d'unicité qui est relevée puis traiter le cas et raiser ActiveRecord::Rollback pour remettre la transaction sql dans un état correct.
Il existe un plugin permettant de gérer ces contraintes (et d'autres) pour postgresql, c'est en cours de discussion sur rails-core pour une éventuelle modification du core afin de gérer plus proprement ce genre de cas. Mais on est encore loin d'avoir une chose uniforme pour cela : http://github.com/pedz/activerecord_constraints/tree/master Je crois que certains parlent même de développer une sorte de gestionnaire de validations qui permettrait à un endroit de déclarer ses règles de validation, d'avoir les contraintes sql liées et de remonter les erreurs de validations ActiveRecord. -- http://fabien.jakimowicz.com --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [email protected] -~----------~----~----~----~------~----~------~--~---
