Ruby on Rails:根据大多数评论的平均评分对用户进行排序?

hel*_*llo 2 ruby-on-rails rating ruby-on-rails-3 ruby-on-rails-3.2

我可以显示商店内的商品和评论.如何获得最多评论的热门项目?我的评论在另一个数据库表中,而不是商店和项目.

调节器

@shop = Shop.find(params[:id]) 
@item = Item.where(:shop_name => @shop.name)
Run Code Online (Sandbox Code Playgroud)

视图

<% @item.each do |u| %>
  <%= u.reviews.average('rating') %>
  <%= u.reviews.count %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法,我可以根据最高评价和大多数评论订购?或者最好将最高评级和大多数评论分开,让用户点击链接进行过滤?

谢谢

编辑:

所以我有一个shop,item,review桌子.

在我的项目模型中

has_many :reviews, as: :reviewable
has_many :shops
Run Code Online (Sandbox Code Playgroud)

在我的评论模型商店模型

belongs_to :user
Run Code Online (Sandbox Code Playgroud)

在我的评论表中,它设置为当用户评论某个项目时,它会向数据库中添加一条记录,并使用average与该项目相关联的所有记录并在商店中显示该记录.

Edg*_*ons 5

如果我理解你的ER模型,你可以试试这个:

@items = Item.where(:shop_name => @shop.name).joins(:reviews)
  .select("items.id, avg(reviews.rating) as average_rating, count(reviews.id) as number_of_reviews")
  .group("items.id")
  .order("average_rating DESC, number_of_reviews DESC")
Run Code Online (Sandbox Code Playgroud)

可能会有一些错别字,但你明白了.也许你可能想要创建某种加权分数,否则在这种情况下,一个5星评价的项目将高于具有五十四星评价的项目.

我在select块中定义的所有自定义列都是字符串类型,因此如果您要对它们进行任何算术运算,则需要手动对它们进行类型转换.