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.

   -- Jean-François.

-- 
À la renverse.

--~--~---------~--~----~------------~-------~--~----~
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]
-~----------~----~----~----~------~----~------~--~---

Répondre à