我正在设置一个简单的 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 的平均评分,然后按最高平均评分对这些记录进行排序并将其显示在视图中。
try @albums = Album.joins(:reviews).select("album.id, avg(reviews.rating) as average_rating).group("album.id").order("average_rating DESC")
我从以下内容推断出:Ruby on Rails:根据最多评论的平均评分对用户进行排序? https://stackoverflow.com/questions/19339140/ruby-on-rails-order-users-based-on-average-ratings-with-most-reviews
Update:
试试这个:@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)