2

我可以显示商店内的物品及其评论。如何获得评论最多的顶级项目?我的评论是在另一个数据库表中比商店和项目。Ruby on Rails:根据大多数评论的平均评分来订购用户?

控制器

@shop = Shop.find(params[:id]) 
@item = Item.where(:shop_name => @shop.name) 

查看

<% @item.each do |u| %> 
    <%= u.reviews.average('rating') %> 
    <%= u.reviews.count %> 
<% end %> 

有一个简单的方法,我可以为了基于与大多数评论或东西的最高评级?或者,也许它更好地分开最高评价和大多数评论,并让用户点击链接来过滤?

感谢

编辑:

所以我有一个shopitemreview表。

在我项目模型

has_many :reviews, as: :reviewable 
has_many :shops 

在我审查模式商店模式

belongs_to :user 

在我的评语表,其设定所以当用户评论中的项目,它向数据库添加了一条记录,并且我使用与该条目相关联的所有记录的average,并显示它与ati在商店里。

+0

可以分享有关表格和模型的更多详细信息,可能是一个很好的SQL查询可以提供帮助。 –

+0

@EdgarsJekabsons我增加了一些细节,它是否更有意义? – hellomello

回答

4

如果我理解正确你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星评论的项目将高于50个4星评论的项目。

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

+0

我正在测试这段代码,并且在'average(reviews.rating)' – hellomello

+0

上获得了错误函数。可能是AVG,我会更新我的答案。 –

+0

真棒这个作品!我假设从长远来看,这种方法会非常缓慢? – hellomello