【问题标题】:Rails: Return highest and lowest associated records from a grouped association value taking the total number of associated records into accountRails:考虑关联记录的总数,从分组关联值返回最高和最低关联记录
【发布时间】:2022-11-04 05:51:51
【问题描述】:

在我们的 Rails 应用程序中,我们有两个表:

products:
 - id
 - name

feedbacks
 - id
 - product_id
 - rating

因此,产品可以有许多具有评级 (1-5) 的反馈。

我们想要做的是通过使用 (4-5) 表示最佳和 (1-2) 表示最差来计算每个产品的反馈数量,从而获得最好和最差的产品。

但是,我们还需要考虑产品的反馈总数,否则如果一个产品碰巧比另一个产品有更多的反馈,它最终可能是最好的和最差的......

例如,我们尝试了以下“应该”返回反馈评级为 4+ 的产品列表,然后第一个元素将是最高的。

Product.joins(:feedbacks).group('feedbacks.rating').having('Max(rating) >= 4')

第一个问题......这是返回这个的正确方法吗?有没有更好的方法来只返回一条记录而不是返回 ActiveRecord 关系并提取第一条记录?

第二个问题......我们如何考虑对产品的反馈数量?所以查询变成了......“对产品的反馈总数评分 4+”

【问题讨论】:

  • 在大型数据库中,您不会有一个后台作业来更新产品记录上的字段以进行计算吗?也许total_reviewsaverage_review_score

标签: ruby-on-rails


【解决方案1】:

编写一个SQL查询,该查询将计算出质量排名听起来令人生畏。

这听起来可能是XY Problem,我会以不同的方式处理它:

目标:

与其兄弟姐妹相比,Product 需要有 ranking

我认为the mathematicians can better speak to 是您选择设置rank 的算法。

我计算rank 的过程是这样的:

  1. ranking 列添加到Product
  2. 编写一个执行“排名”计算的作业
  3. 触发此作业以按计划在后台运行,或者在创建/更新Feedback 时运行。
  4. 使用ranking 列来创建一个非常简单的.order_by(ranking: :desc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多