【问题标题】:Ruby on Rails: Order users based on average ratings with most reviews?Ruby on Rails:根据评论最多的平均评分对用户进行排序?
【发布时间】:2016-04-06 17:08:27
【问题描述】:

我可以显示商店内的商品及其评论。如何获得评论最多的顶级商品?我的评论在另一个数据库表中,而不是 shop 和 item。

控制器

@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 表。

在我的 items 模型中

has_many :reviews, as: :reviewable
has_many :shops

在我的reviews model和shops model中是

belongs_to :user

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

【问题讨论】:

  • 您能否分享有关您的表和模型的更多详细信息,可能一个好的 SQL 查询会有所帮助。
  • @EdgarsJekabsons 我添加了一些细节,是不是更有意义一点?

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 rating


【解决方案1】:

如果我理解正确你的 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 块中定义的所有自定义列都是字符串类型,因此如果您要对它们进行任何算术运算,则需要手动对它们进行类型转换。

【讨论】:

  • 我正在测试这段代码,我在average(reviews.rating)得到错误函数
  • 太棒了!我假设这种方法从长远来看会很慢?
  • 实际上,如果您正确索引表/列,它不应该(当然在某种程度上)。但这是一个完全不同的话题,我需要查看更多关于表结构的 SQL 和详细信息以提出任何建议。
  • 感谢您的帮助。也许当我到达那里时,我会尝试提出一个新问题。
  • 如果我需要对@items 进行计数怎么办?目前,这在我的类似情况下会引发错误
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多