2012-04-25 6 views
13

다음은 설명과 사용자 사이의 관계입니다. 각 코멘트에는 한 명의 사용자가 있으므로 아래 코드에서 조인을 작성합니다.레일 3 조인 - 특정 열만 선택하십시오.

이 코드를 작성하여 조인의 특정 열만 포함시키는 지 궁금합니다. 나는 모든 사용자 정보가 필요하지 않습니다. 그냥 첫 번째 이름. 어떤 제안.

현재 코드 : 결과 외국 열 값을 검색하는 방법을 보여 알도의 답변을 확장

@comments = Comment.joins(:user) 
        .select("comments.*, users.first_name") 
        .where(study_id: @study.id) 
+0

귀하의 댓글 모델에는 사용자 연합이 있습니까? 열심히 사용자 정보를로드하려고합니까? ActiveRecord가 아직 제공하지 않은 조인으로 무엇을하려합니까? – PinnyM

+1

예. 정보를 열심히 읽으려고합니다. 현재는 각 댓글에 대해 사용자를 위해 사용자를 수행합니다. – Kyle

답변

21

이 같은 것을 사용할 수 있습니다.

@comments = \ 
    Comment\ 
    .joins(:user) 
    .select("comments.*, users.first_name as users_first_name") 
    .where(study_id: @study.id) 

# Now it's stored on each comment as an attribute, e.g.: 
puts @comments.first.read_attribute(:users_first_name) 
puts @comments.first.attributes['users_first_name'] 

# Note that inspecting the comment won't show the foreign data 
puts @comments.first.inspect # you won't see user's first name output 

또한 attr_accessible과 코멘트에 ATTRIB로 users_first_name를 선언 할 수 있습니다. 내가 자동으로 설정하는 마법의 방법은 없다고 생각하지만 포스트 선택 루프에서 쉽게 그렇게 할 수 있습니다.

+1

여기에서 조인은 내부 조인과 같이 동작합니다. 그렇지 않으면 다음을 사용하십시오 : User.includes (: comments) .select (...) –

3

:

@comments = Comment.where(:study_id => @study.id).joins(:user) 
+1

Beautiful-이 해냈어 – Yarin

+0

이것은 작동합니다. 그러나 출력 (인스턴스 '@ comments.first.inspect'또는 '@ comments.inspect')을 조사 할 때 조인 된 데이터가 표시되지 않으며 끌어 내지 못하는 것으로 잘못 인식 될 수 있습니다. 그러나 "예"와 같이이 예제에서와 같이 "as"이름을 지정하면 그 이름이 나타납니다. – JosephK

+0

좋은 점은 예제에 추가했습니다. – mahemoff

관련 문제