0

我有一个 rails 应用程序,它使用letsrate 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 以显示数组中的平均值。

4

1 回答 1

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
于 2013-05-15T03:59:09.170 回答