我正在设置一个简单的ruby / rails应用程序,用户可以在其中查看相册。在相册的展示页面上,我通过相册控制器中的此代码平均与该相册相关的所有用户评论
def show
@album = Album.find_by_id(params[:id])
if @album.reviews.present?
@ratings = Review.where(album_id: @album).average(:rating).truncate(2)
else
render 'show'
end
end
这给了我每张专辑的平均评分。在我的主页上(通过不同的控制器路由)我想显示平均评分最高的前7张专辑。
我最初做的是将此代码放入单独的主页控制器中:
@albums = Album.all
@ratings = @albums.each {|album| album.reviews.average(:rating).to_f}
@ranked_ratings = @ratings.sort_by {|rating| rating}
@top_seven = @ranked_ratings.reverse[0...7]
我想我找到了解决方案,直到我意识到所有我正在展示的是最后输入数据库的7张专辑。
回到绘图板我已经能够在我的控制器中使用此代码获取所有相册的数组(数组中的每个元素都是与该相册相关的评论列表):
@albums = Album.all
@ratings = @albums.collect {|album| album.reviews}
我在这一点上陷入困境,试图弄清楚如何在@ratings中循环并找到每个album_id的平均评分,然后按最高平均评分排序这些记录并在视图中显示它们。
答案 0 :(得分:1)
尝试@albums = Album.joins(:reviews).select("album.id, avg(reviews.rating) as average_rating).group("album.id").order("average_rating DESC")
我从Ruby on Rails: Order users based on average ratings with most reviews?
推断出来<强>更新强>
尝试这样做:@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")