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