On May 26, 3:58 pm, "Cyril Mougel" <[EMAIL PROTECTED]> wrote:
> On 5/26/07, Jean-François <[EMAIL PROTECTED]> wrote:
>
>
>
> > Cyril :
>
> > > CREATE TABLE acteur_film_role {
> > > id INTEGER,
> > > acteur_id INTEGER,
> > > film_id INTEGER,
> > > role_id INTEGER
> > > }
>
> > > Mais avec Rails, impossible de voir comment le schématiser à
> > > part en créant un nouvel objet model qui schématisera cette
> > > nouvelle table composé de
> > > belongs_to et has_many
>
> > Oui et c'est une bonne solution àmha.
>
> > class Acteur < AR::B
> > has_many :compositions
> > has_many :films, :through => :compositions
> > has_many :personnages, :through => :compositions
> > end
>
> > class Film < AR::B
>
> > has_many :compositions
> > has_many :acteurs, :through => :compositions
> > has_many :personnages, :through => :compositions
> > end
>
> > class Personnage < AR::B
> > has_many :compositions
> > has_many :acteurs, :through => :compositions
> > has_many :films, :through => :compositions
> > end
>
> > Et le "join model" :
>
> > class Composition < AR::B
> > belongs_to :acteur
> > belongs_to :film
> > belongs_to :personnage
>
> > validates_uniqueness_of :acteur_id, :scope => [ :film_id, :personnage_id ]
> > end
>
> > Pour avoir la liste des films d'un acteur : acteur.films.uniq
> > tous les personnages qu'il a joués : acteur.personnages.uniq
>
> > tous les acteurs qui ont joué James Bond : james_bond.acteurs.uniq
>
> > pour créer une composition :
> > Composition.create :acteur => acteur, :film => film, :personnage =>
> > personnage
> > ou
> > Composition.create :acteur_id => acteur_id, :film_id => film_id,
> > :personnage_id => personnage_id
>
> > ou sean_connery.compositions.create(:personnage => james_bond,
> > :film => docteur_no)
>
> > etc.
>
> > donc on peut manipuler dans tous les sens.
>
> > > Mais cela m'imposera de créer cette objet à
> > > chaque fois pour faire une liaison.
>
> > C'est pas la mer à boire.
>
> > > Car en effet, le has_and_belongs_to_many, ne me permet
> > > de faire la liaison avec une base intermédiaire que de deux
> > > champs, pas trois.
>
> > L'autre avantage est que tu peux rajouter des champs
> > supplémentaire à la table compositions, genre 'doublage_voix'
> > pour préciser le rôle (j'ai préféré le terme personnage,
> > mais tu fais comme tu veux) par exemple d'Eddy Murphy
> > dans Shrek.
>
> Merci beaucoup Jean-François. Très bonne explication. Je comprend tout.
>
> --
> Cyril Mougel
je trouve que vous vous compliquez la vie.
un role a 0,n acteurs.
un acteur a 0,n roles.
donc il faut 3 tables:
acteurs 0,n->joue<-0,n roles
un film a 0,n roles
un role a a un seul film
donc:
films 0,n->roles
un film a plusieurs acteurs
ceci est trouvable par nos associations définis ci dessus
films->roles->joues->acteurs
de meme pour un acteur a plusieurs films
acteurs->joue->roles->films
certains pourraient me repliquer que mon modele ne fonctionne pas avec
l'exemple suivant.
plusieurs films ont le des acteurs qui joue le role de james bond.
je reponds que le role de james bon n'est pas le meme dans casino
royal que dans docteur no.
plusieurs roles peuvent avoir le meme nom de personnage.
on peut donc eventuellement rajouter une table pour lever toute
ambiguité:
roles 0,1<->0,n personnages.
il faut noter que les associations de rails ont un sens bcp plus
larges que dans merise ou UML.
on peut tres bien definir une association entre 2 modeles non pas par
une clé etrangere mais par une requete SQL
à l'aide de l'option :finder_sql.
donc on peut creer une association entre films et acteurs à l'aide
d'une requete sql.
--~--~---------~--~----~------------~-------~--~----~
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]
-~----------~----~----~----~------~----~------~--~---