2009-07-24 2 views
13

열망로드는 내가 궁금하네요레일을 열심히로드하고 있습니까?

Post.find(:all, :include => :author) 

속성을 포함하여 좋은 당신이 할 수있는 경우도 열망 부하 수, 나는 모든 의견 스스로를로드하지 않고, 각 게시물에 대한 의견의 번호를 원한다면 같은?

아마

Post.find(:all, :include => [:author, "count(comments)") 

같은 나는 내가 count_cache 열을 사용할 수도있을 것 같군요. 하지만 가능하다면 모든 것을 포함 시키면 정말 아름답습니다.

누군가가 카운트를 얻는 방법뿐만 아니라 승인 된 게시물 개수와 같은 몇 가지 조건을 제시 할 수 있다면 추가 보너스 포인트가됩니다.

+0

이것은 나중에이 질문에서 확장되었습니다 : http : //stackoverflow.com/questions/4908878/how-do-i-get-rails-to-eager-load-counts /stackoverflow.com/questions/2870521/how-will-activerelation-affect-rails-includes-s-capabilities (내가 찾은 방법입니다.) –

답변

-6

MySQL에서는 적어도 두 개의 개별 호출로 수행하는 것이 더 빠릅니다. 가입을 피할 수 있기 때문입니다. 나는이 질문에 대한 답변하지 않습니다 알아,하지만 당신이 더 나은 속도를 얻으려고 노력하고

Post.find ... 

을하고 다음

post.comments.count 

보다 빠르고 메모리 효율적인 (데이터베이스)가있는 것처럼 보인다 한 검색어에서 두 검색어를 모두 가져 오는 것보다

+4

글쎄, 열심히로드를 사용하는 주요 이유 중 하나는 N + 1 쿼리를 피하는 것입니다. – MrTheWalrus

+3

이것은 N + 1 쿼리를 유도하고 질문에 대답하지 않습니다. – davidgoli

24

나는이 시도

+2

나는 이것이 그가 찾고있는 것이라고 생각하지 않습니다. 이것은 주석 연결의 모든 항목을로드 한 다음 계산합니다. 그는 SQL을 사용하여 개체를로드하지 않고 열심히 카운트를 가져 오려고합니다. (또는 적어도 그것이 내가 그것을 어떻게 이해하는지). – Mike

+0

네 말이 맞아. –

+1

이것은 내가 찾던 해결책이었다. 내가 컬렉션을 반복하고 댓글 수를 표시하고 싶은 게시물의 색인 페이지 및 색인 페이지 - 각주기에서 계산 요청을 발생시키지 않습니다 (주석이 게시물과 함께 열심히 제공되는 경우). 고마워 :-) – Renra

2

을 .count 사용했기 때문에 이미 사용

post.comments.length 
나는이 같은 문제가되었다

을로드해야합니다

Comment.count(:group => :post) 

조건에 의해 필터링하려면 :

Comment.count(:group => :post, :conditions => {:approved => true }) 

이것들은 키로 게시물과 값으로 코멘트 수를 해시로 반환합니다.

+0

정확히 내가 원하는 건 아니에요. 예, 이렇게 별도의 통화로 처리 할 수 ​​있습니다. 그러나 나는 당신이 내가 원했던 것처럼 협회에서 할 수 있다고 생각하지 않습니다. 아마도 count_cache 컬럼을 사용해야 할 것이다. –

3

avaynshtok의 답변을 바탕으로 다음 기술은 단지 2 번의 데이터베이스 호출을해야합니다.

# ./app/controllers/posts_controller.rb 

def index 
    # First load the posts 
    @posts = Post.all 

    # Then you can load a hash of author counts grouped by post_id 
    # Rails 3 version: 
    @comment_counts = Comment.count(:group => :post_id) 
    # Rails 4 version: 
    # @comment_counts = Comment.group(:post_id).count 
end 

그런 다음보기

<!-- ./app/views/posts/index.html.erb --> 

<% @posts.each do |post| %> 
    <!-- reference the count by the post.id --> 
    post_count: <%= @comment_counts[post.id] %> 
<% end %> 
0

에 난 그냥이 문제에 달려 있으며이 방법으로 해결 : 데이터베이스에

def trainee_counts 
    @trainee_counts ||= Hash[Trainee.group(:klass_id).count] 
end 

    # where the count is needed 
    trainee_counts[klass_id].to_i 

한 전화를하고 연수생을로드하지 않습니다.

관련 문제