Ruby Forum Rails France > association polymorphique compliquée

Posted by Adrien Nom (korn900)
on 28.06.2009 08:42
Bonjour,
J'ai besoin de développer une relation polymorphique et de stocker le
type de la table de référence et l'id dans deux tables différentes
(comme ca, ca ne doit pas être très clair).
Voilà l'exemple :

table PERSONNES
- id
-...

table VILLES
- id
- nom

table PAYS
- id
- nom

table MANDATS
- id
- nom
- lieu_type = VILLE ou PAYS

table ELUS
- id
- personne_id
- mandat_id
- lieu_id -> fait référence à la table VILLES ou PAYS en fonction du
lieu_type du mandat associé

Est-il possible de mettre ca en place ?
Si non, quelle solution voyez-vous pour obtenir un résultat similaire ?
Merci à tous
Adrien
Posted by Guillaume BELLEGUIC (Guest)
on 28.06.2009 09:29
(Received via mailing list)
Bonjour,

C'est possible, mais est tu sur d'avoir besoin de la table Elus ?
avec personnes, villes, pays et mandats pour faire la jointure tu
devrais pourvoir t'en sortir, non ?

Le 28 juin 09 à 08:42, Adrien Nom a écrit :
Posted by Adrien Nom (korn900)
on 28.06.2009 10:08
Oui j'ai besoin de la table ELUS car une personne peut avoir plusieurs 
mandats, j'ajoute aussi dans la table ELUS un champ booléen `ancien` qui 
indique si c'est un renouvelement du mandat ou pas.
Posted by Adrien Nom (korn900)
on 28.06.2009 13:17
Quelqu'un peut-il me dire comment réaliser ca en rails, malgrè mes 
recherches je ne trouve rien :s Je lis l'anglais mais ne cherche 
peut-être pas bien.
Posted by Guillaume Betous (Guest)
on 28.06.2009 13:30
(Received via mailing list)
> Oui j'ai besoin de la table ELUS car une personne peut avoir plusieurs
> mandats, j'ajoute aussi dans la table ELUS un champ booléen `ancien` qui
> indique si c'est un renouvelement du mandat ou pas.
>

D'après ce que j'en comprends, ce n'est pas un argument. Si dans ta 
table
mandat tu ajoutes un personne_id, tu as donc une relation personne 
has_many
mandats et mandats belongs-o personne, une personne pourra avoir 
plusieurs
mandats sans soucis. de plus dans cette meme table mandats tu peux 
rajouter
ton champ 'ancien'.

gUI

--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
Posted by Adrien Nom (korn900)
on 28.06.2009 13:39
Ok je n'avais pas bien compris ce que tu voulais dire, alors non cela ne 
me va pas car MANDATS sert à lister les mandats possibles existants. Il 
n'y a pas forcément une personne élue pour chaque mandat, certains ne 
seront peut être pas utilisés.
Posted by Guillaume Betous (Guest)
on 28.06.2009 17:01
(Received via mailing list)
c'est un autre Guillaume qui avait posté dans un premier temps (-;

peut-il y avoir plus d'une personne sur un meme mandat ?

gUI

Le 28 juin 2009 13:39, Adrien Nom <list-incoming@andreas-s.net> a écrit 
:

>
> Ok je n'avais pas bien compris ce que tu voulais dire, alors non cela ne
> me va pas car MANDATS sert à lister les mandats possibles existants. Il
> n'y a pas forcément une personne élue pour chaque mandat, certains ne
> seront peut être pas utilisés.
> --
> Posted via http://www.ruby-forum.com/.
>
> >
>


--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
Posted by Adrien Nom (korn900)
on 28.06.2009 18:02
Guillaume Betous wrote:
> c'est un autre Guillaume qui avait posté dans un premier temps (-;
oups je n'avais pas vu, désolé
> 
> peut-il y avoir plus d'une personne sur un meme mandat ?
oui il peut y avoir plusieurs personne pour un même mandat
bon je donne des exemples pour expliciter un peu tout ca :

ce que j'ai prévu :
- mandat vas contenir des enregistrement du genre
(0,maire,villes)
(1,conseiller municipal,villes)
(2,ministre,pays)
(3,président,pays)
- elu va contenir des enregistrement du genre :
(0,jacques machin,maire,poitiers)
(1,michel ducoin,maire,chatellerault)
(2,jacques vigneret,conseiller municipal,angouleme)
(3,monique dufour,ministre,france)
(4,martine dugalet,presidente,irlande)
NB: j'ai remplacé personne_id,mandat_id,ville_id par 
personne.nom,mandat.nom,ville.nom

la table mandat me sert à obtenir la liste des mandats possibles pour 
les afficher dans un formulaire où l'on choisira les mandats de chaque 
personne.

donc les solutions que je vois sont :
1) ce que j'ai dit premièrement
2) ajouter (dupliquer) type_lieu dans la table elus (c'est peut être le 
plus simple même si ce n'est pas très propre?)
2) grouper les tables elus et mandats :
MANDATS
- id
- nom
- lieu_id
- lieu_type
- personne_id
auxquels cas je stockerai la liste des mandats possibles en créant des 
mandats associés à aucune personne (ce sera la liste des mandats que 
j'affiche dans le formulaire)

Une autre précision un peu hors sujet :
Il faudrait aussi que je laisse la possibilité à l'utilisateur d'ajouter 
des mandats et des types de lieu (donc de créer une nouvelle table de 
lieu par exemple DEPARTEMENTS), je ne sais pas si je pourrai y arriver 
sans que l'on ai à modifier du code mais si oui, ma solution devrait 
être celle qui permet de faire ca.
J'espère que j'ai été clair.
Merci pour votre aide !
adrien
Posted by Guillaume Betous (Guest)
on 28.06.2009 18:10
(Received via mailing list)
> oui il peut y avoir plusieurs personne pour un même mandat


ok, je vois. je suis pas du tout specialiste du polmorphisme, je pense 
que
ce que j'aurais fait à ta place  c'est tout simplement de mettre 2 id 
dans
ELU, par exemple pays_id et ville_id, et selon le mandat, je remplis 
l'un ou
l'autre (et j'utilise l'un ou l'autre).

mais je suis pas sur que ce soit la solution la plus élégante.


gUI

--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
Posted by Adrien Nom (korn900)
on 28.06.2009 18:13
hum, merci mais non cette solution ne me convient pas, c'est trop moche 
:-) je préfère encore dupliquer type_lieu dans les tables MANDATS et 
ELUS

si quelqu'un d'autre pouvez me conseiller, j'aimerai développer ca le 
plus proprement possible !

adrien
Posted by Nicolas Blanco (slainer68)
on 28.06.2009 20:07
(Received via mailing list)
Salut !

1ère remarque : tu aimerais faire cela le plus proprement possible
comme tu le dis, donc déjà n'utilise jamais de variables ou de noms de
tables en Français dans tes logiciels, et cela quel que soit ton
logiciel.
2ème remarque : a mon avis ça serait très simple à implémenter en
Rails si tes modèles City et Country découlent en STI d'un modèle
Place. D'ailleurs en regardant ton schéma ils ont pour l'instant les
mêmes attributs.

Nicolas.

Le 28 juin 2009 08:42, Adrien Nom<list-incoming@andreas-s.net> a écrit :
Posted by Adrien Nom (korn900)
on 28.06.2009 20:20
Nicolas Blanco wrote:
> Salut !
> 
> 1�re remarque : tu aimerais faire cela le plus proprement possible
> comme tu le dis, donc d�j� n'utilise jamais de variables ou de noms de
> tables en Fran�ais dans tes logiciels, et cela quel que soit ton
> logiciel.
je vais y penser, mais ca me semble fastidieux de chercher tous les 
termes en anglais, surtout que cette aplication ne sera jamais traduite. 
c'est peut être pas très joli mais ca ne change quand même pas grand 
chose ?

> 2�me remarque : a mon avis �a serait tr�s simple � impl�menter en
> Rails si tes mod�les City et Country d�coulent en STI d'un mod�le
> Place. D'ailleurs en regardant ton sch�ma ils ont pour l'instant les
> m�mes attributs.
C'est vrai mais j'ai beaucoup simplifié le schéma, en fait pour Ville il 
y aura comme information l'adresse de la mairie, telephone, email,etc.. 
autant d'information qui sont inutiles dans la table pays.
Je peux quand même faire une table lieu polymorphique :
LIEUX
- id
- lieu_type
- lieu_id
qui renverrai vers les différentes tables de lieu mais c'est moche aussi 
non ? sachant qu'il y a beaucoup de table de lieu 
(pays,regions,departements,communes,cantons...), je ne pense pas que ce 
soit bien de faire ca ?

Plus ca va, plus je me demande bien comment je vais résoudre ce problème 
:S
Ma première solution n'est vraiment pas correcte?
Quelle autre approche je peux avoir ?
Dupliquer le champ lieu_type n'est pas optimal mais il n'y a pas non 
plus de risque d'incohérence car le type de lieu correspondant a un 
mandat ne changera jamais.
Merci
adrien
Posted by Guillaume Betous (Guest)
on 28.06.2009 22:09
(Received via mailing list)
> c'est peut être pas très joli mais ca ne change quand même pas grand
> chose ?


c'est surtout très piégeux, Rails considérant les singluiers et pluriels 
à
l'anglaise.

gUI

--
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
Posted by Adrien Nom (korn900)
on 29.06.2009 09:06
Je saurai y faire attention :)
merci