Ruby Forum Rails France > Validation sur un array

Posted by Laurent RICHARD (Guest)
on 12.03.2008 17:59
(Received via mailing list)
Bonjour à tous.

La question me semble assez basique mais je n'ai pas encore trouver de
solution malheureusement.

J'ai une classe Person qui contient des données de clients.

J'ai une classe Category qui contient des noms de catégories

La relation entre les 2 est un habtm.


J'ai codé un truc un peu sale pour vérifier qu'une catégorie n'est pas
ajoutée 2X pour une même persone dans le contrôleur Person.

Mais en fait, je sais que ce n'est pas sa place et qu'il doit être
possible de faire un validates_uniqueness ou un truc custom dans le
modèle mais je ne vois pas comment.

Quelqu'un aurait une piste pour m'aider ?

Grand merci.
--
Laurent RICHARD
laurent.richard@rubyfr.org
------------------------------------------------------------------
What gets us into trouble is not what we don't know.
It's what we know for sure that just ain't so.
-- Mark Twain
------------------------------------------------------------------

PGP-fingerprint  8260 2267 9714 07E3 182F  C7B0 9581 794B D743 6F61
My public key is available at : http://pgp.mit.edu  Key_ID=D7436F61
Posted by Fabien JAKIMOWICZ (Guest)
on 12.03.2008 18:08
(Received via mailing list)
On Mar 12, 2008, at 5:35 PM, Laurent RICHARD wrote:

> La relation entre les 2 est un habtm.
>
> Grand merci.

Tu peux définir la fonction validate dans tes modèle, qui sera appelée 
à chaque sauvegarde. Pour lever une erreur, utilise alors Errors.add
Posted by Laurent RICHARD (Guest)
on 12.03.2008 19:13
(Received via mailing list)
Le mercredi 12 mars 2008 à 18:07 +0100, Fabien JAKIMOWICZ a écrit :

> Tu peux définir la fonction validate dans tes modèle, qui sera appelée  
> à chaque sauvegarde. Pour lever une erreur, utilise alors Errors.add

Tu veux dire avec un genre boucle qui vérifie que pour chaque
categorie.id n'apparait pas dans les suivants ?

--
Laurent RICHARD
laurent.richard@rubyfr.org
------------------------------------------------------------------
What gets us into trouble is not what we don't know.
It's what we know for sure that just ain't so.
-- Mark Twain
------------------------------------------------------------------

PGP-fingerprint  8260 2267 9714 07E3 182F  C7B0 9581 794B D743 6F61
My public key is available at : http://pgp.mit.edu  Key_ID=D7436F61
Posted by Fabien Jakimowicz (Guest)
on 12.03.2008 20:06
(Received via mailing list)
2008/3/12 Laurent RICHARD <laurent.richard@rubyfr.org>:
>
>  Le mercredi 12 mars 2008 à 18:07 +0100, Fabien JAKIMOWICZ a écrit :
>
>
>  > Tu peux définir la fonction validate dans tes modèle, qui sera appelée
>  > à chaque sauvegarde. Pour lever une erreur, utilise alors Errors.add
>
>  Tu veux dire avec un genre boucle qui vérifie que pour chaque
>  categorie.id n'apparait pas dans les suivants ?
>
Désolé, je pensais que le problème se situait sur l'emplacement du
code de validation.

Pour ton cas (éviter les doublons), tu devrais juste te contenter de
faire un find avec des conditions et des inclusions pour vérifier la
présence / abscence de la ligne. Sinon tu peux aussi le faire en ruby
(moins performant selon les cas) en utilisant directement la relation
habtm.

--
Fabien Jakimowicz
Posted by Fabien Jakimowicz (Guest)
on 12.03.2008 20:07
(Received via mailing list)
2008/3/12 Fabien Jakimowicz <fabien@jakimowicz.com>:
>  >
>  Désolé, je pensais que le problème se situait sur l'emplacement du
>  code de validation.
>
>  Pour ton cas (éviter les doublons), tu devrais juste te contenter de
>  faire un find avec des conditions et des inclusions pour vérifier la
>  présence / abscence de la ligne. Sinon tu peux aussi le faire en ruby
>  (moins performant selon les cas) en utilisant directement la relation
>  habtm.
>

je viens de me rendre compte que j'ai surement mal compris. Tu
souhaites te éviter qu'une catégorie ne soit utilisable que par une
personne a la fois ? Dans ce cas, pourquoi le habtm ?


--
Fabien Jakimowicz
Posted by Laurent RICHARD (Guest)
on 12.03.2008 20:50
(Received via mailing list)
Le mercredi 12 mars 2008 à 20:07 +0100, Fabien Jakimowicz a écrit :
> >  >  categorie.id n'apparait pas dans les suivants ?
> 
> je viens de me rendre compte que j'ai surement mal compris. Tu
> souhaites te éviter qu'une catégorie ne soit utilisable que par une
> personne a la fois ? Dans ce cas, pourquoi le habtm ?

En fait, pour résumé, toutes les personnes peuvent utiliser toutes les
catégories.

J'ai juste envie d'éviter qu'une même catégories se retrouvent plusieurs
fois dans la liste d'une même personne.

Je viens de penser au :unique dans le modèle mais je n'ai pas encore
testé.--
Laurent RICHARD
laurent.richard@rubyfr.org
------------------------------------------------------------------
What gets us into trouble is not what we don't know.
It's what we know for sure that just ain't so.
-- Mark Twain
------------------------------------------------------------------

PGP-fingerprint  8260 2267 9714 07E3 182F  C7B0 9581 794B D743 6F61
My public key is available at : http://pgp.mit.edu  Key_ID=D7436F61
Posted by Laurent RICHARD (Guest)
on 12.03.2008 22:36
(Received via mailing list)
Le mercredi 12 mars 2008 à 20:20 +0100, Laurent RICHARD a écrit :
> > >  >  Tu veux dire avec un genre boucle qui vérifie que pour chaque
> > >
> 
> Je viens de penser au :unique dans le modèle mais je n'ai pas encore
> testé.

J'ai coupé l'herbe sous le pied. J'ai fait un

 execute "ALTER TABLE categories_organisms ADD CONSTRAINT UNIQUE
(organism_id, category_id);"

dans la table de jointure. Et j'ai catché l'erreur pour le flash.

--
Laurent RICHARD
laurent.richard@rubyfr.org
------------------------------------------------------------------
What gets us into trouble is not what we don't know.
It's what we know for sure that just ain't so.
-- Mark Twain
------------------------------------------------------------------

PGP-fingerprint  8260 2267 9714 07E3 182F  C7B0 9581 794B D743 6F61
My public key is available at : http://pgp.mit.edu  Key_ID=D7436F61
Posted by Fabien Jakimowicz (Guest)
on 13.03.2008 02:29
(Received via mailing list)
2008/3/12 Laurent RICHARD <laurent.richard@rubyfr.org>:
>  > >  >
>  > >  présence / abscence de la ligne. Sinon tu peux aussi le faire en ruby
>
>  J'ai juste envie d'éviter qu'une même catégories se retrouvent plusieurs
>  fois dans la liste d'une même personne.
>
>  Je viens de penser au :unique dans le modèle mais je n'ai pas encore
>  testé.

ok, en effet c'est plus simple une fois compris.

Le mot clé uniq devrait te protéger pour la récupération, mais ca peut
etre en dupliqué dans la base.

--
Fabien Jakimowicz