SQL查询到Rails 3的平均用户评级

时间:2013-05-15 03:40:53

标签: sql ruby-on-rails activerecord

我有一个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以显示数组中的平均值。

1 个答案:

答案 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