2012-03-17 4 views
1

내보기로 전달되는 인스턴스 변수를 만듭니다. 이 변수 'post'는 user_id와 연관되어 있으므로 'username'이라는 추가 속성을 추가하여이를 전달하고보기에서 사용할 수 있습니다.Rails에서 인스턴스 변수에 매개 변수 추가

다음은 내가하고 싶은 일의 예입니다.

@post = Post.find(params[:id]) 
@post.username = User.find(@post.user_id).username 

내 사용자 모델에는 사용자 이름 열이 있지만 노래 모델은 없습니다. 그래서 제가 그냥 완전히 새로운 인스턴스 변수를 만들고 거기에 해당 정보를 넣을 수 있습니다 알고

@post.username 

를 사용하지 않습니다하지만 난 하나 개의 변수에, 좋은 깔끔한 모든 것을 유지하고 싶습니다. 또한 json 렌더링 코드를 더 깨끗하게 보일 것입니다.

어떻게 수행 할 수 있습니까?

감사합니다.

답변

4

Post 모델에 user_id이있는 것을 기반으로 사용자 이름을 검색 할 수있는 연결이 이미 설정되어있을 수 있습니다. 레일에게 .includes를 호출 인덱스 페이지에서, 예를 들어, 한 번에 (두 개 이상의 게시물을 조회 할 수 가능성이 있다면

@post = Post.find(params[:id]) 
username = @post.user.username 

: 그것은 아마 단순히 기존 연결을 사용하는 문제를 많이 절약 할 수 열망 부하에 연결하면 the N+1 problem을 방지하는 데 도움이됩니다

마지막으로
@posts = Post.includes(:user).all 

, 당신의 JSON 출력에 관련된 기록을 포함, 당신은 직렬화로 :include 매개 변수를 전달 :

# in controller 
render :json => @post.to_json(:include => :user) 

This question에는 훨씬 더 포괄적 인 직렬화 옵션에 대한 설명이 포함되어 있습니다. 읽기 좋은 가치가 있습니다.

+0

감사를 통과 할 수있다, 나는이 관계에 대해 아무 생각이 없었다. 페이지의 json 출력에 사용자 이름 정보를 추가 할 여지가 있습니까? – Dan

+0

예. 내 대답 – rjz

+1

업데이트 할 것입니다. 그것은 별개의 문제입니다. 어떻게 JSON으로 렌더링합니까? 기본값을 사용하는 경우 to_json 호출에 옵션을 전달하십시오. 예 : render : json => @ post.to_json (: include => : user). 또는 Post JSON 객체가 애플리케이션의 모든 사용자 이름을 갖기를 원한다면 Post 모델에서'as_json' 메소드를 커스터마이징하십시오. –

2

별도의 인스턴스 변수를 전달할 필요가 없습니다. 1.보기에서 @post.user.username을 사용할 수 있습니다. 2. 아니면 도우미를 작성하고 @post.user

def username user 
user.username 
end 
+0

예. @ post.user.username은 정상적으로 작동했습니다. 그러나 내 json 출력 여전히 user_id = # 어쨌든 나는 페이지에 대한 JSON 출력에 사용자 이름을 추가 할 수 있습니까? – Dan

+0

json을 @ post.to_json (: include => : user)로 렌더링하는 동안 사용자를 추가해야합니다. – asitmoharna

+0

감사합니다. asitmoharna이 솔루션이 작동했습니다. 빠른 답변 감사합니다 – Dan