通过'has_many'获取属性的平均值

时间:2018-01-12 03:23:19

标签: sql ruby-on-rails ruby rails-activerecord

我在这里有两个模型,一个标签和一个评级。

Tab has_many Ratings,每个Rating belongs_to一个Tab;每个Rating的{​​{1}}介于1和5之间。

以下是我的模型,以及相关代码:

tab.rb

value

rating.rb

class Tab < ApplicationRecord
  ...
  has_many :ratings, dependent: :destroy
  ...
end

这就是我的索引视图的显示方式:

https://i.imgur.com/XVf2Rt5.png

class Rating < ApplicationRecord ... belongs_to :tab ... end 列是标签的平均评分值。

目前,为了获得每个标签的平均评分,我正在对每个标签的平均评分执行查询。这非常缓慢,我希望改进这一点。

这是我的控制器,使用相关的方法:

tabs_controller.rb

Rating

这些是我加载标签class TabsController < ApplicationController ... def index # need to display average rating # don't want to do one query for each tab # so, make index return a table that includes avg rating as a column @tabs = Tab.all end ... end 页面时生成的所有查询:

enter image description here

我认为我需要在index控制器方法中执行一个查询,该方法返回一个包含所有选项卡的表,以及每个选项卡的平均评级。我该怎么做?

我可能还需要使用视图。如果有人能引导我朝着正确的方向前进,那将非常感激。

2 个答案:

答案 0 :(得分:3)

尝试使用此功能。这将有效

Tab.joins(:ratings).select("tabs.*, AVG(ratings.value) AS average_ratings").group("tab.id") 

答案 1 :(得分:0)

我在jQuery Raty之前使用过here

要在TabsController show动作中计算平均评分,您可以添加此

...
@ratings = Rating.where(tab_id: @tab.id)
if @tab.ratings.any?
    @avg_rating=@tabs.average(:value).round(2)
 else
    @avg_rating=0
end


...

并在展示页面中显示

<div class="start-rating" data-score= <%= @avg_rating %> ></div>

但在索引页面中,请执行此操作

<div class="start-rating" data-score= <%= tab.ratings.average(:value) %> > </div>