2017-04-02 3 views
0

두 가지 모델 블로그와 의견이 있습니다. 블로그에는 여러 개의 댓글이 포함되어 있으며, 댓글은 블로그 1 개에만 속할 수 있습니다. 블로그/2/코멘트처럼 API를 보여주는다음 코드를 리펙토링 하시겠습니까?

/1

나는

def show 
    @blog = Blog.find(params[:blog_id]) 
    @comments = @blog.comments 
    @comment = @comments[params[:id].to_i - 1] 
    end 

가이 코드는 특히 마지막, 매우 akward 느낌 주석 컨트롤러 내부에 다음 코드를 사용해야합니다 하나 @comments[params[:id].to_i - 1]. 매개 변수 ID를 정수로 변환 한 다음 배열 색인을 0으로 변경해야합니다. 모든 리팩토링이 여기서 일어날 수 있습니다

+2

예,이 코드의 역할은 명확하지 않습니다. 각 게시물/블로그가 자체적으로 댓글 카운터를 운영하도록하는 것입니까? 왜 그냥 주석 테이블의 id 필드를 사용하지 않는가? –

+0

네, 각 게시판에 독자적인 코멘트 카운터를 달아야합니다. –

답변

0

"Rails"가 더 보이도록 만들겠습니까? 이렇게?

def show 
    @blog = Blog.find(params[:blog_id]) 
    @comment = @blog.comments.find params[:id] 
end 

OP의 의견에 따르면. 귀하의 변형은 필요합니다입니다. 그러나 전체 주석 집합을로드하지 않고 필요한 것을 취할 수는 있습니다.

@comment = @blog.comments.offset(params[:id].to_i - 1).limit(1) 
+0

'find '를 사용하고'[]'를 사용하여 요소에 액세스하는 것과는 다른 점이 있습니다. 'find'는'0'으로'ActiveRecord :: RecordNotFound' 예외를 발생시키고'[]'는'0'으로 맨 처음 요소를 가져옵니다. –

+0

그리고 이것이 거기에 -1이없는 이유입니다 ... –

+0

그것은 내 디자인을 충족하지 않습니다. 블로그/2/comment/1은 블로그 2의 첫 번째 댓글을 반환해야하지만,이 구현 형 return null은 블로그 1 인 경우 첫 번째 댓글입니다. –

관련 문제