我可以显示商店内的商品及其评论。如何获得最多评论的热门项目?我的评论在另一个数据库表中,而不是商店和项目。
控制器
@shop = Shop.find(params[:id])
@item = Item.where(:shop_name => @shop.name)
查看
<% @item.each do |u| %>
<%= u.reviews.average('rating') %>
<%= u.reviews.count %>
<% end %>
是否有一种简单的方法可以根据最高评价或大多数评论订购?或者最好将最高评级和大多数评论分开,让用户点击链接进行过滤?
由于
编辑:
所以我有shop
,item
,review
表。
在我的项目模型
中has_many :reviews, as: :reviewable
has_many :shops
在我的评论模型和商店模式是
belongs_to :user
在我的评论表中,它设置为当用户评论某个项目时,它会向数据库添加一条记录,并使用与该项目关联的所有记录的average
并在其中显示店。
答案 0 :(得分: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")
可能有一些错别字,但你明白了。也许你可能想要创建某种加权分数,否则在这种情况下,一个5星评价的项目将高于有五十四星评价的项目。
我在select
块中定义的所有自定义列都是字符串类型,因此如果您对它们进行任何算术运算,则需要手动对它们进行类型转换。