2013-05-15 3 views
0

나는 석판 보석을 사용하여 특정 차원의 레스토랑을 평가하는 레일 앱을 보유하고 있습니다. 각 레스토랑의 모든 평점의 평균을 계산하여 색인 페이지의 배열에 사용자에게 표시하고 싶습니다.평균 사용자 등급을위한 SQL 쿼리 3 레일

내 SQL 쿼리는 다음과 같이 보일 것이다 -

select avg(stars) from RESTAURANTS r, RATES rs 
where rs.rateable_id = r.id 
group by r.name; 

처럼 내 인덱스의 배열이 보인다 - 나는의 평균을 표시 레일에 SQL 쿼리를 번역 얼마나 궁금

<% @restaurants.each do |restaurant| %> 
<li> 
    <a href="<%=restaurant_path(restaurant) %>" > 
     <div class="left"> 
      <h2 class="name"><%= restaurant.name %></h2> 
      <h3 class="location"><%= restaurant.location %></h3> 
     </div> 
     <div class="right"> 
      <h4 class="rate">AVERAGE RATING</h4> 
     </div> 
     <div class="clear"></div> 
    </a> 
</li> 
<% end %> 

정렬.

답변

1

관계를 올바르게 설정하면 올바르게 작동합니다. 그렇지 않다면 나는 그들을 고칠 수 있도록 도와 줄 것이다.

을 편집 레스토랑 컨트롤러에서

: 당신의 레스토랑 index.html.erb에서

class RestaurantController > ApplicationController 

    def index 
    @restaurants = Rate.joins(:restaurant).select("avg(rates.stars) as res_avg, restaurants.name, restaurant.location").group("restaurants.name") 
    end 
end 

: 당신이하려는 경우

<% @restaurants.each do |restaurant| %> 
<li> 
    <a href="<%=restaurant_path(restaurant.id) %>" > 
    <div class="left"> 
     <h2 class="name"><%= restaurant.name %></h2> 
     <h3 class="location"><%= restaurant.location %></h3> 
    </div> 
    <div class="right"> 
     <h4 class="rate"><%= restaurant.res_avg %></h4> 
    </div> 
    <div class="clear"></div> 
    </a> 
</li> 
<% end %> 

Edit2가 다시 사용 이 쿼리는 모델의 범위에서이를 선언합니다.

class Restaurant < ActiveRecord::Base 
    #all your model code 
    scope :avg_restaurant_rates, joins(:rate).select("avg(rates.stars) as res_avg, restaurants.name, restaurants.location").group("restaurants.name") 
end 
+0

고맙습니다! 여기서 제가 아직도 혼란스러워하는 곳이 있습니다. 이제 인덱스 뷰에서 각 레스토랑의 평균을 표시하려면 어떻게해야합니까? 제가 약간 녹슬었던 곳은 모델 메서드를 정의하고 거기에이 메서드를 추가하여 배열의 해당 메서드를 호출하는 것입니까? –

+0

이 방법이 효과가 있지만 <% = restaurant_path (restaurant) %>를 깨뜨리는 경우 컨트롤러에서 정의하는 것보다 더 나은 방법이 있습니까? 쇼 뷰에서 평균 등급을 재사용하고 싶다고 가정하면,이 경우 헬퍼 메소드로 더 적합할까요? –

+0

레일 경로 헬퍼는 경로를 결정하기 위해 id 값이 필요합니다. 필요한 변경 사항을 반영하도록 코드를 업데이트했습니다. 이 쿼리를 다시 사용하려면 Restaurant Model에서 스코프로 작성합니다. – eabraham