2011-04-12 7 views
0

을 게시물 지수에 댓글을 제한하고 2. 아래나는 레일에 새로운 오전 레일에 앱

내 게시물 색인 페이지에 표시되는 댓글의 수를 제한하려고하는 것은 내 posts_controller입니다 PHOT :

has_attached_file 내 포스트 모델

클래스 포스트 < 액티브 :: 자료입니다 > => "600x600>", : thumb => "100x100>"} => "# {RAILS_ROOT}/config/s3, : storage => : s3, :> YML " : 경로 =>"/ : 첨부 파일/: ID/: 스타일/: 파일 이름 "

has_many :

유효성을 검사 의견 : 이름 : 존재 => 사실이 확인합니다 : 제목 : 존재 = > 참 : 길이 => {최소 => 5}

단부

,451,515,

아래는 내 게시물

<% div_for comment do %> 
    <p> 
     <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago 
     </strong> 
       by 
       <br/> 
       <%= h(comment.commenter) %> 
       <br/> 
     <%= h(comment.body) %> 
       <br/> 
       <%= link_to 'More Comments', comment.post %> 
    </p> 
<% end %> 

내가 오류 메시지가 표시되지 않는 경우 아래

<table> 
    <tr> 
    <th>BoxScore</th> 
    <th>Content</th> 
    </tr> 
</table> 

<% @posts.each do |post| %> 
    <%= image_tag post.photo.url(:medium), :class =>"floatleft" %> 
    <p> 
    <%= post.content %> 
    </p> 
    <div class="comments center"> 
    <h3>Comments:</h3> 
     <%= render :partial => post.comments.reverse %> 
    <div class="links"> 
    <% if admin? %> 
     <%= link_to "New Post", new_post_path %> 
     <%= link_to 'Edit', edit_post_path(post) %> 
    <%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %> 
    <% end %> 
    <%= link_to 'Comment on the Game', post %> 
    </div> 
</div> 
<% end %> 

</div> 

댓글 부분 인덱스이다, 난 그냥 우리가 렌더링되는 의견의 양을 제한하는 방법을 모른다 게시물 색인 페이지. 감사합니다

+0

당신은 당신의 부분의 내용도 의견에 관련 먹으 렴를 게시하고이 함께지고 오류의 종류를 말해야한다. –

답변

1

열심히로드 된 연결에 조건을 지정할 수 없습니다. 마찬가지로, 조건에 따라 반환되는 행 수를 제한 할 수 없습니다 (SQL 함수에 대해 알지 못하는 많은 것들이 있지만, 필자가 아는 한).

은 그래서 당신이 함께 붙어있어 중 하나

  1. 로드 쿼리에 표시하고있는 게시물에 대한 코멘트의 모든, 그리고 수는 응용 프로그램에서 표시 부분 제한.
  2. 개별적으로 표시된 각 게시물에 대해 2 개의 댓글 만로드하십시오..

최적의 솔루션은 사용 사례에 따라 다릅니다. 5 개의 게시물 만 표시하고 각각에 대해 수천 개의 의견이있을 것으로 예상되는 경우 옵션 1은 성능이 좋지 않고 옵션 2는 좋은 해결책 일 수 있습니다. 페이지 당 더 많은 게시물을 표시하고 어느 하나에 대한 의견 만 있으면 (가장 가능성있는 시나리오) 첫 번째 옵션이 최선의 방법이 될 것입니다.

옵션 1 개

# controller 
@posts = Post.limit(20).all 
@comments = Comment.find(@posts.collect &:id).group_by &:post_id 

# view 
<% @comments[@post.id].first(2).each do |comment| %> 
    ... 
<% end %> 

옵션 2

# controller 
@posts = Post.limit(5).all 

# view 
<% post.comments.limit(2).each do |comment| %> 
+0

'all '을 호출하는 것은 일반적으로 결과가 배열임을 보장하지 않으려는 경우 나쁜 생각입니다. 'ActiveRecord :: Relation'은'Array'가 가지고있는 대부분의 메소드에 응답하므로'each' 또는'map' /'collect' 쌍을 반복 할 수 있습니다. 그러나'모두'열망하는 것은 성과의 관점에서 좋은 아이디어가 아닌 결과 집합을로드합니다. –

+0

@GaborGarami 이것은 사실 일 수 있지만 항상 그렇지는 않습니다. Rails의 CRUD 내에서 애플리케이션이 깔끔하게 적용된다면 컨트롤러가 뷰 레이어가 반복으로 실행하는 Arel 쿼리를 조합하도록 할 수 있습니다. 그러나 검색 후 데이터를 조작하거나 사용자 정의 캐시 키를 어셈블하거나 해당 객체를 수정해야하는 경우 (예 :'@ post.touch (: last_viewed) ')와 같이 많은 경우가 있습니다. 또한 컨트롤러에서 SQL 쿼리 (모델 책임)를 직접 트리거하는 뷰를 갖는 것이 바람직합니다. – coreyward

+0

예, 예외는 항상 여기에 있습니다 :-). 그러나 적어도 대답의 경우에는 '모두'는 불필요합니다. –