2013-05-15 30 views
0

我有一個導航應用程序,使用letrate gem爲特定維度上的餐廳評分。我想計算每家餐廳的所有評級的平均值,並將其顯示給索引頁上的數組中的用戶。針對平均用戶評分的SQL查詢導航3

我的SQL查詢應該是這樣的 -

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

在我的索引數組看起來像 -

<% @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 %> 

想知道如何將轉換SQL查詢到軌以顯示平均值陣列。

回答

1

如果你正確設置你的關係,這應該工作。如果沒有,我會幫你修復它們。

編輯

在你的餐廳控制器:

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 

在你的餐廳index.html.erb:

<% @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(餐廳)%>,有沒有更好的方式來處理這個比在控制器中定義它?假設我想在展示視圖中重新使用平均評分,在這種情況下,這會更適合作爲輔助方法嗎? –

+0

rails路徑助手需要id值來確定路徑。我更新了代碼以反映所需的更改。爲了重用這個查詢,我會在餐廳模型中作爲範圍寫入。 – eabraham