Bonjour,

Comme explicité dans le titre (ou presque), je cherche à utiliser au
mieux :through avec has_many. Puisqu'un exemple concret vaut tous les
grand discours, voici 4 tables d'un forum que j'aimerai joindre :

class Forum < AR::B
     has_many :categories
end

class Category < AR::B
     has_many :subjects
     belongs_to :forum
end

class Subject < AR::B
     has_many :message
     belongs_to :category
end

class Message < AR::B
     belongs_to :subject
end

Jusque là, tout fonctionne :) Je souhaiterai désormais m'attarder sur
ma classe Forum. Une relation simple à ajouter est
"has_many :subjects, :through => :categories". J'aurai également aimé
ajouter "has_many :messages, :through => :subjects" mais ça ne semble
pas fonctionner... (Mysql::Error : Unknown column 'subjects.forum_id'
in 'where clause' en faisant un simple "forum.messages" dans ma vue).

Du coup, et après de longues recherches [1], je me suis tourné vers
une méthode :
def messages
    msg = []
    subjects.each {|s| msg << s.messages}
    msg.flatten
end

Si mon "forum.messages" fonctionne désormais, ça se corse dès que je
souhaite faire un "forum.messages.find(:all, :conditions => ['view =
0'])", par exemple, pour voir tous les message qui n'ont jamais été
lus.
Je suis donc à la recherche de conseils, espérant ne pas être le seul
à implémenter une hierarchie de quatres tables :) Quel est le moyen le
plus simple et surtout le plus propre de créer ses relations dans mes
modèles? Comment faire en sorte que mon forum.messages.find(:all)
fonctionne?

Un grand merci pour votre aide.

Florent

[1] Je n'ai trouvé qu'un seul sujet intéressant sur la question :
http://www.ruby-forum.com/topic/115029
--~--~---------~--~----~------------~-------~--~----~
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 à