2012-08-29 3 views
0

기사 # 색인에 얼마나 많은 의견을 표시하려고하는지 각 기사에서 어디에.레일 개수 얼마나 많은 기사

그래서 나는 다음과 같은 모델

resources Article do 
resources Comments do 
end 
end 

내가 추적을 할 수있는 각 문서에 알고이 일 것 같습니다

@count = @article.comments.find(:all).count 

을 그리고 뷰 수에 표시 단지. 그러나 문제는 내가 인덱스 파일에있을 때 얼마나 많은 코멘트가이 이벤트 atm에 존재하는지 보여주는 방법이 확실하지 않을 때입니다. 사전에

감사

+3

내가 강하게위한 카운터 캐시를 사용하는 것이 좋습니다 것 HAML에 할 모든 기사에 대한 댓글의 수를 표시하기 위해 다음과 같이

@article.comments.find(:all) 

을 지정

%table %thead %tbody - @articles.each do |article| %tr = article.comments.count 

를 필요 없어요 이것은 SQL 측면에 많은 부담을 줄 수 있기 때문입니다. RailsCast에서이 에피소드를보고 어떻게 끝 났는지보십시오. http://railscasts.com/episodes/23-counter-cache-column – Kitto

+0

Kitto의 의견은 답변으로 게시해야하며 올바른 대답으로 받아 들여야합니다. –

답변

1

articles_controller.rb

def index 
    @articles = Article.all 
end 

기사/index.html.erb

<% @articles.each do |article| %> 
    comments in article <%= article.comments.count %> 
<% end %> 

중첩 된 경로

가 (기사 내 댓글) 당신의 생성의 측면에서 더 중요/비평 노선을 파괴하십시오. 또한 기사 모델에 accepts_nested_attributes_for :comments을 추가해야합니다. 이것은 당신이 이런 식으로 물건을 할 수 있습니다 : 예를 들어

, articles_controller.rb의 성능에 대해 걱정 시작할 경우

def show 
    @article = Article.find(params[:id]) 

    # creates a new comment object with atricle_id already initialized 
    @comment = @article.comments.build 
end 

편집

, 나는 Kitto의 의견에 동의합니다.

이 마이그레이션 추가

class AddCommentsCountToArtices < ActiveRecord::Migration 
    def change 
    add_column :articles, :comments_count, :integer, null: false, default: 0 
    end 
end 

을 그리고 여기에 귀하의 코멘트 모델에 관계 선언을 변경

belongs_to :article, counter_cache: true 

은 다음 당신은 atricle.comments.count 대신 수를 얻기 위해이 article.comments_count 같은 통화를 할 수 있습니다. 그리고 카운트가 0이라면 쿼리 (심지어 레일즈 3 웨이 195 쪽)조차 만들지 않기 때문에 위대한 것입니다.

counter_cache의 작동 방식에 대해 궁금한 경우 : 주석을 만들거나 삭제할 때마다 상위 기사의 comments_counter 속성을 업데이트하는 소속 클래스 (이 경우에는 Comment 클래스)에 콜백을 추가합니다.

또한 counter_cache 기능은 Obie Fernandez가 기존 데이터베이스에 쉽게 demonstrated here으로 추가 할 수 있습니다.

+0

감사합니다. 너무 쉽게, 허용 될 때 받아 들일 것입니다 !! – Jseb

+0

아, 아무 문제 없어 :) – anxiety

1

articles # index에서 모든 기사가 들어있는 인스턴스 변수를 반복 할 수 있습니다. 귀하의 견해는 다음과 비슷한 모습이 될 것입니다

@articles.each do |article| 
    article.name 
    . 
    . 
    article.comments.count 
end 
1
@article.comments 

은 @article에 대한 모든 의견을 제공 할 것입니다.당신은보기