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