我的餐厅有很多员工,每位员工都有很多客户评级。
我想创建一个统计信息页面,按照月平均评分显示员工。
在员工模型中:
def avg_rating
date = Date.today
ratings_total = self.ratings.sum(:score, :conditions => {:created_at => (date.beginning_of_month..date.end_of_month)}).to_f
ratings_count = self.ratings.count(:conditions => {:created_at => (date.beginning_of_month..date.end_of_month)}).to_f
return (ratings_total/ ratings_count)
end
在餐厅控制器中我有:
def restaurant_stats
@restaurant = Restaurant.find(params[:restaurant_id])
@employees = @restaurant.employees.all
end
在餐厅统计视图中:
<table>
<% @employees.each do |employee| %>
<tr>
<td><%= employee.name %></td>
<td><%= employee.avg_rating %></td>
</tr>
<% end %>
</table>
我不确定如何让员工按照正确的顺序?我假设我必须在restaurant_stats动作中以正确的顺序检索值,而不仅仅是@ restaurant.employees.all但是我不知道如何因为员工模型中使用的功能而
答案 0 :(得分:1)
你可以从控制器那里做到:
@employees = @restaurant.employees.all.sort_by {|employee| employee.avg_rating}
或更简洁
@employees = @restaurant.employees.all.sort_by(&:avg_rating)
请注意,这会将所有员工加载到内存中进行排序。
答案 1 :(得分:0)
尝试餐厅控制器:
@employees = @restaurant.employees.all.sort {|x,y| y.avg_rating <=> x.avg_rating }
或
@employees = @restaurant.employees.all.sort_by(:avg_rating)
答案 2 :(得分:0)
你可以创建一个数组并对其进行排序 我认为下面有效,但没有检查
@employees = @restaurant.employees.collect {|p| [ p.name, p.avg_rating ]}
@employees.sort!{ |a,b| (a[1] <=> b[1]) }