2010-11-25 10 views
0

Salut, je suis en train de construire une petite application de forum avec des rails (3). Je suis assez nouveau dans le domaine des Rails et je me suis coincé quand je veux tirer les cartes du haut (un forum appartient à un forum) spécifié avec un identifiant de forum). "Définition d'une carte supérieure": une carte appartenant à un forum_id spécifique qui a le plus de sujets topic_replies &.compter petits-enfants d'un objet dans les rails

"l'arbre généalogique": Forum> Conseil> Sujet> TopicReply

mes modèles:

**forum.rb** 

class Forum < ActiveRecord::Base 
    default_scope :order => 'display_order ASC' 
    has_many :boards, :dependent => :destroy 
end 


**board.rb** 

class Board < ActiveRecord::Base 
    default_scope :order => 'display_order ASC' 

    belongs_to :forum 
    has_many :topics, :dependent => :destroy 
    has_many :topic_replies, :through => :topics 

    def latest_topic_reply 
    t = TopicReply.find_by_sql("SELECT tr.* from topic_replies tr, topics t where tr.topic_id = t.id AND t.board_id = #{self.id} ORDER BY tr.updated_at desc LIMIT 1;")[0] 
    end 
end 


**topic.rb** 

class Topic < ActiveRecord::Base 
    belongs_to :board 
    has_many :topic_replies, :dependent => :destroy 
end 


**topic_reply.rb** 

class TopicReply < ActiveRecord::Base 
    belongs_to :topic 
end 

Dans SQL je ferais ceci:

"SELECT b.* FROM boards b,topics t WHERE t.board_id=b.id AND b.forum_id=2 GROUP BY board_id ORDER BY SUM(t.topic_replies_count) DESC LIMIT 4;" 

Je préfère gérer cette avec des enregistrements actifs (ou n'est-ce pas mieux que le SQL?), je ne le connais pas encore tout à fait. Quelqu'un pourrait-il me pousser dans la bonne direction s'il vous plaît?

Merci à l'avance

Répondre

2

Vous pouvez essayer de le faire fonctionner comme ceci:

Board.joins(:topics).where(:forum_id => @forum.id).order(:topic_replies_count).to_sql 

En utilisant to_sql vous pouvez voir ce que SQL qu'il génère. Le topic_replies_count serait un counter cache column dans Topic qui contient le nombre actuel de réponses de sujets associés.

Voir les détails sur Rails 3 interrogation dans le guide.

+0

merci pour la référence pour la colonne de cache, ne le savais pas encore. Je n'ai pas encore trouvé le bon ActiveRecord, mais j'ai ajouté le bon SQL. – Ayrton

+0

Que voulez-vous dire par "n'avez pas trouvé le bon AR"? Si vous remplacez le '.to_sql' par' .all' par exemple, ce morceau de code retournera la collection ou 'Boards' dont vous avez besoin, commandé correctement. – Matt