【问题标题】:How to display highest rated albums through a has_many reviews relationship如何通过 has_many 评论关系显示评分最高的专辑
【发布时间】:2014-01-18 03:02:12
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails sqlite ruby-on-rails-4 rails-activerecord has-many


    【解决方案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")

    【讨论】:

    • 是的,这就是数据库的用途。可能最好让 SQL 处理它,而不是在 Ruby 中排序和收集。
    • 我在使用您建议的解决方案时遇到很多语法错误,正在尝试重构,是否应将 avg 大写?
    • 尝试将平均值更改为平均值。
    • 我把它改成了这个@albums = Album.joins(:reviews).select("album.id", average(reviews.rating), as: average_rating).group("album.id").order("average_rating DESC"),但是我得到一个未定义的局部变量或方法`reviews'错误
    • 或者像你说的大写AVG。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多