如何通过has_many评论关系显示评分最高的专辑

我正在设置一个简单的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的平均评分,然后按照最高平均评分对这些记录进行排序并在视图中显示。

试试@albums = Album.joins(:reviews).select("album.id, avg(reviews.rating) as average_rating).group("album.id").order("average_rating DESC")

我从以下内容推断出: Ruby on Rails:根据大多数评论的平均评分对用户进行排序?

更新:

试试这个: @albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")