En fait, à l'instar du monsieur Jourdain de Molière avec la prose, tu fais
des HABTM sans le savoir.

A partir du moment où tu as :
Model1.has_many :model2
Model3.has_many :model2

Model2.has_one :model1
Model2.has_one :model3

Tu as une relation HABTM implicite entre Model1 et Model3, que tu peux
matérialiser comme suit :
Model1.has_many :model3, :through => :model2
Model3.has_many :model1, :through => :model2

Ok, la méthode de AR::B n'est pas has_and_belongs_to_many comme avec une
table de jointure simple, mais le principe est le même.

Maintenant, la ou les question à te poser c'est :
- est-ce que j'ai besoin d'une table de jointure complexe, et si oui
pourquoi ?
- (en fonction de la réponse au "pourquoi ?") est-ce que la ou les données
supplémentaires qui apparaissent dans la table de jointure peuvent être
replie(s) automatiquement (= sans saisie supplémentaire de l'utilisateur)
- (en fonction de la réponse au "peut être rempli automatiquement") est-ce
qu'il n'y a pas un autre moyen de répondre au besoin qu'une liste de cases à
cocher ?

A priori, je dirais que la donnée supplémentaire est un booléen
"propriétaire du thread". Si c'est le cas, tu peux résoudre ça simplement en
modifiant ton modèle de donnée de cette façon :

add_column :topic, :owner_id, :integer

Topic.has_one :owner, :model => :character
Character.has_many :topics, :foreign_key => :owner_id

Et en revenant à un modèle de jointure habtm classique. Ca a l'avantage
d'être moins gourmand en espace dans ta base de données parce que ça fait
seulement un integer par Topic plutôt que 1 integer par jointure (dans une
bonne part des SGBD un integer est stocké dans un integer).

Sinon tu peux aussi adapter le 2° exemple que je t'ai donné à l'origine,
mais ceça me semble moins propre (un topic à forcément un et un seul
propriétaire).

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