我有一个rails应用程序,使用letrate gem对特定尺寸的餐馆进行评级。我想计算每家餐馆所有评级的平均值,并在索引页面的数组中显示给用户。
我的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查询转换为rails以显示数组中的平均值。
答案 0 :(得分: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