2010-11-25 10 views
0

こんにちは、私は現在、レール(3)で小さなフォーラムアプリケーションを構築しています。私はRailsの問題ではかなり新しいです。フォーラムIDで指定されたトップボード(掲示板はフォーラムに属しています)を引っ張りたい時には固まってしまいました。レール内のオブジェクトの孫をカウントする

「トップボードを定義する」:特定のforum_idに属するボードで、最もトピック数が多いのは&です。

"家系図":私はこれを行うだろう

SQLで
**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 

:フォーラム>ボード>トピック> TopicReply

私のモデル

"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;" 

私はこれを管理することを好みますしかし、アクティブなレコード(これはSQLより優れているのではないですか?)では、私はあまりにもそれに精通していません。誰か私を正しい方向に押してください。事前

答えて

2

ありがとうございます、それはこのように動作するように試みることができる:

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

あなたはそれが生成するものを見ることができるSQL to_sqlを使用することにより。 topic_replies_countは、Topiccounter cache columnであり、関連するトピック応答の現在の数を保持します。

guideでRails 3のクエリに関する詳細を参照してください。

+0

キャッシュ列の参照のおかげで、まだそれを知らなかった。まだ適切なActiveRecordが見つかりませんでしたが、適切なSQLを追加しました。 – Ayrton

+0

"正しいARを見つけられませんでした"とはどういう意味ですか? '.to_sql'を' .all'に置き換えた場合、このコードは必要なコレクションや 'Boards'を正しく返します。 – Matt

関連する問題