2012-01-07 3 views
2

모델/host.rb레일 3 has_many (왼쪽 가입)

class Host < ActiveRecord::Base 
    has_many :report, :dependent => :delete_all 
end 

모델/report.rb을 선택

class Report < ActiveRecord::Base 
    belongs_to :host 
end 

지금은 자신의 보고서를 모든 호스트를 선택합니다 여기에는 보고서가없는 호스트도 포함됩니다.

나는

list=Host.all(:joins => "left join `reports` on reports.host_id=host.id") 

하여이를 달성하기 위해 시도했지만 레일 만 hosts 테이블에서 필드를 선택처럼 보인다. 따라서 list[0].report으로 보고서 개체에 액세스 할 수 없습니다. 또한 원시 SQL 명령을 사용하지 않고 select를 수행하는 것이 더 행복 할 것입니다 - 루비와 비슷한 방식으로.

SQL을 사용하지 않고 하나만 선택하여 호스트와 보고서를 모두 얻는 방법은 무엇입니까?

답변

1

당신은 할 수

Host.eager_load(:reports) 

에 가입 할 어떤 보고서 테이블을 만들고 모든 보고서 개체를 인스턴스화합니다. 로드 된 호스트 및 보고서는 요청시로드되는 것처럼 정확히 사용할 수 있습니다.

+0

대단히 감사합니다! 그게 내가 찾고 있었던 바로 그 것이다. – gorootde

0

목록 = Host.joins는

보고서를 생성하지 않습니다이 코드는 당신을 위해 단지 호스트 객체 ("왼쪽 reports.host_id = host.id에 reports 가입"). 하지만 지금 보고서 테이블 에서 일시적 속성을 contins 오브젝트 호스트는 당신이 그 (것)들에게

목록에 액세스 할 수 있습니다 [0] [: column_name_from_reports_table]

+0

그게 내가 기대했던 것입니다. 불행히도'list [0] .inspect'는 호스트 테이블의 속성 만 보여줍니다. 또한 로그에는'SELECT hosts. * FROM ... '이 실행되었다고 나와 있습니다. – gorootde

0

호스트 테이블 이외의 필드를 선택하려면 항상 select method을 사용하면됩니다.

Host.joins('left join reports on reports.host_id = hosts.id').select('reports.id, reports.column1, reports.column2, hosts.column1') 등.

이것은 레일의 가장 좋은 기능 중 하나입니다. 많은 경우 한 줄로 원하는 결과를 얻을 수 있습니다.