【问题标题】:How to average product review scores using activerecord and POSTGRES如何使用 activerecord 和 POSTGRES 平均产品评论分数
【发布时间】:2012-03-17 21:31:56
【问题描述】:

假设我有一张包含 100 条产品评论的表格。每条评论都有一个“id”、“product_id”和“score”。现在,我想做的是展示每个产品的平均分数......那么有没有办法使用 Rails 查询数据库来做到这一点?我确定一定有,但我想不通。我希望发生以下情况:

Toyota Corolla 70%
Toyota Camry 78%
Toyota Avalon 80%

.. 显然基于对每个平均的多个评论,但以上述方式呈现。

更新:

对于那些对解决方案感兴趣的人

这是在控制器中:

@ordered_hash = Review.group('aidmodel_id').average('score')
@keys = @ordered_hash.keys
@reviews = Review.where(:aidmodel_id=>@keys).uniq_by {|x| x.aidmodel_id}

这是在视图中:

<% @reviews.each do |review| %>

    <%= review.aidmodel.id %>
    <%= @ordered_hash[review.aidmodel_id] %>

  <% end %>

@ordered_hash[review.aidmodel_id] 行提供具有所需 ID 的辅助模型的平均分数。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 postgresql


    【解决方案1】:

    您可以混合使用 averagegroup 来做类似的事情

    MyClass.group('product_id').average('score')
    # => {product_id1 => average1, product_id2 => average2, ... }
    

    【讨论】:

    • 谢谢鲍德里克。对我来说只有一个问题。在 Rails 控制台中运行时出现错误:ActiveRecord::StatementInvalid: PG::Error: ERROR: column "reviews.created_at" 必须出现在 GROUP BY 子句中或在聚合函数中使用。知道是什么原因造成的吗?
    • 我只是在控制台中运行了以下命令(在我的例子中,aidmodel_id 等同于 product_id):Review.group('aidmodel_id').average('score')
    • 我不知道你为什么会出现这个错误。我已经在我的一个模型上进行了测试,它给了我以下 SQL 请求 Match.group('championship_id').average('date') => (30.0ms) SELECT AVG("matches"."date") AS average_date, championship_id AS championship_id FROM "matches" GROUP BY championship_id
    • 啊,是的,这就是问题所在。 Postgres 更严格一些……关于 SO 的一些帖子与 Postgres 的这个问题相关,但查询与我的有点不同……所以我仍然无法弄清楚。无论如何,谢谢,我会支持你的答案,但会等待与 Postgres 相关的答案 =)
    • @Abram:这应该适用于 PostgreSQL,你到底在尝试什么?顺便说一句,还有Model.average(:x, :group =&gt; :y)
    【解决方案2】:

    您需要将查询更改为

    MyClass.select('product_id').group('product_id').average('score')
    

    看看question

    更新:

    试试MyClass.select('DISTINCT(product_id)').group('product_id').average('score')

    看这里group by in postgres

    【讨论】:

    • 不幸的是,我看到了同样的错误:SELECT AVG("reviews"."score") AS average_score,aidmodel_id ASaidmodel_id FROM "reviews" GROUP BYaidmodel_id ORDER BY reviews.created_at DESC ActiveRecord::StatementInvalid : PG::Error: ERROR: column "reviews.created_at" 必须出现在 GROUP BY 子句中或在聚合函数中使用
    • 您的代码确实有效......所以我赞成它,但 Baldrick 已经与我合作了一段时间,他解决了我的问题......这是我的 Review 模型中的默认范围。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多