2012-08-28 7 views
0

오후 모두ActiveRecord :: 관계 객체 가져 오기

나는 많은 호텔이있는 월 모델이 있습니다. 호텔은 한 달에 속하고 이름, 정보, 그림, twitter_id 등이 있으며 부울 인 승자 열이 있습니다. 몇 달 동안의 내 색인보기에서, 매월 나는 "승자"가 사실 인 호텔의 이름을 보여주고 싶습니다.

나는 다음과 같은 쿼리를 시도했다.

<% @months.each do |month| %> 
    <td><%= month.date %></td> 
    <td><%= month.created_at.strftime("%v") %></td> 
    <td><%= month.hotels.where(winner: "true") %></td> 
<% end %> 

이 반환됩니다. #<ActiveRecord::Relation:0x007fae1ed9cd70> (끝의 slapping .name은 "hotel"의 관계 이름 만 제공)

이기는 호텔의 이름을 검색하는 쿼리를 어떻게 수행 할 수 있습니까?

모든 포인터가 좋은 감사 것입니다, 내 코드는 다음과 같습니다; 그냥 소리 더 많은 코드가 필요한 경우

months_controller.rb

def show 
    @month = Month.find(params[:id]) 
    @hotels = @month.hotels 
    end 

    def index 
    @months = Month.paginate(page: params[:page], per_page: 10).includes(:hotels) 
    end 

. 많은 수상자가있을 수 있습니다

month.hotels.where(winner: "true").first.try(:name) 

경우 당신이 할 수 있습니다 :이 모든 수상자의 이름의 배열을 반환합니다

month.hotels.where(winner: "true").pluck(:name) 

각 달에 하나의 승자가 가정 환호 앤디

답변

1

where 쿼리를 실행하면 호텔 개체의 배열이 반환됩니다. 어쩌면 당신은 하나의 호텔과 같이 검색 할 find_by 대안을 사용하려고합니다

month.hotels.find_by_winner(true).name 

편집 :

<% winner = month.hotels.find_by_winner(true) %> 
<%= winner.name if winner %> 

이름 방법이 승자가 nil이 아닌 경우에만 호출됩니다 이런 식으로.

+0

안녕 Murifoz를 제거하여 .name을 사용하면 올바르게 호텔을 가져옵니다. 내 달 중 하나에 승자가 없으며 올바르게 표시되지 않습니다. 그러나 .name을 호출 할 때 Nilclass의 정의되지 않은 메서드 이름을 사용하면 오류가 발생합니다. 이 이름이 수수께끼인가? – dodgerogers747

+0

글쎄요, 월에 승자가 없다면, 그것은 nil을 반환 할 것이고, 당신이 nil에 .name 메소드를 호출하면, 당신에게이 에러를 줄 것입니다. 할 수있는 일은 무 검사기를 수행하는 것입니다. 나는 대답을 편집 할 것이다. – MurifoX

+0

내게 일어난 적이없는 절대적인 전설! 덕분에 murifox! Andy – dodgerogers747

1

.

+0

안녕하세요, Erez 님, 해당 월의 첫 번째 호텔 이름 만 검색하는 것으로 보입니다. 내 달 중 하나에 아직 승자가 없으므로 아무것도 표시해서는 안되지만 "Ritz" – dodgerogers747