我在这里有两个模型,一个标签和一个评级。
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
这就是我的索引视图的显示方式:
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
页面时生成的所有查询:
我认为我需要在index
控制器方法中执行一个查询,该方法返回一个包含所有选项卡的表,以及每个选项卡的平均评级。我该怎么做?
我可能还需要使用视图。如果有人能引导我朝着正确的方向前进,那将非常感激。
答案 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>