2009-04-19 5 views
7

나는 모든 사용자의 프로필과 관련 사진을 보여주고 싶은 인덱스 페이지가 있습니다. 나는 사진을 위해 플러그인 Paperclip을 사용하고있다. 프로파일 컨트롤러에서 인스턴스 변수 @profile을 가졌지 만 프로필 테이블에만 테이블을 표시하고 사진 테이블은 표시하지 않습니다. Ruby on Rails : 두 테이블을 결합하는 방법

@profile = Profile.find(:all, :include => :photos, 
    :joins => "INNER JOIN photos ON photos.profile_id = profiles.id") 

모델

은 다음과 같습니다

class Profile < ActiveRecord::Base 
    has_many :photos 
end 

class Photo < ActiveRecord::Base 
    belongs_to :profile 
end 

내가보기에 표시 할 수 있도록하려는 것은 같은 :

  • 존의 프로필 (예를 들어, 이름, 나이, 섹스) - 존의 사진 (예 : 한 장의 사진 만 표시)
  • 메리의 프로필은 여기에 - 메리의 사진은 여기에 표시
  • Bob 님의 프로필 - Bob 님의 사진이 여기에 표시됩니다.
+0

(뷰)

@profiles = Profile.find(:all, :include => :primary_photo) 

, 어떻게 결정합니까 (모델)에

특정 프로필에 대해 표시 할 사진은 무엇입니까? 이것이 일대일 관계인가? (예를 들어 프로필에 profile_photo에 대한 외래 키가 있거나 특정 사진이 "기본"으로 표시 될지 여부를 나타내는 사진에 부울 열이있을 수 있습니다.) –

+0

예, 부울이라는 기본 열이 있습니다. 1로 설정하면 사진이 표시됩니다. – Max

답변

15

추가 의견을 반영하여 답변을 편집했습니다.

먼저 :joins 매개 변수가 필요하지 않습니다. :include => :photos은 "뒤에서"조인을 처리해야합니다.

여기에 대해 묻고있는 한 가지 방법이 있습니다. 프로파일이 많은 사진이있는 경우 (컨트롤러)에

class Profile < ActiveRecord::Base 
    has_many :photos 
    has_one :primary_photo, :class_name => "Photo", :conditions => {:primary => true} 
end 

<% @profiles.each do |profile| %> 
    Name: <%= profile.name %> 
    Age: <%= profile.age %> 
    Photo: <%= image_tag profile.primary_photo.url %> 
<% end %> 
+0

사진 테이블에 기본이라는 부울 열이 있습니다. 기본 열이 1로 설정된 경우에만 사진을 표시 할 수 있습니까? profile.photos.each 태그 다음에 <% = if photo.primary = 1 %> 행을 추가해도 작동하지 않는 것 같습니다. – Max

+0

자, 이제 작동 중입니다. 데이터베이스의 기본 열에 int 대신 tinyint를 사용해야합니다. – Max