程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了通过 Rails 中关联相关的属性来排序数据?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决通过 Rails 中关联相关的属性来排序数据??

开发过程中遇到通过 Rails 中关联相关的属性来排序数据?的问题如何解决?下面主要结合日常开发的经验,给出你关于通过 Rails 中关联相关的属性来排序数据?的解决方法建议,希望对你解决通过 Rails 中关联相关的属性来排序数据?有所启发或帮助;

我有一个 Post 模型和一个 RevIEw 模型,它们之间是一对多的关系。我正在尝试编写控制器代码来对帖子进行排序。我希望用户能够对帖子进行排序的方法之一是根据他们的汇总评分,目前这些评分是通过属于该帖子的所有 revIEw.raTing 的简单平均值计算得出的。对于更简单的排序,我可以执行类似 Post.order(ID: :asC) 的操作,但由于每个帖子的平均评分不是数据库中的显式属性,因此相同的方法不起作用。

我现在想知道尝试用我没有经验的 sql 来做这件事是否是个好主意,以及我是否应该在 posts 模型中创建一个方法来返回所有内容的有序列表帖子。显然我不能像写框架那样写代码,所以毫无疑问我的方法效率会低得多。

这里最好的方法是什么,假设我以后还想添加更多的排序方法?仅此一次的拼接解决方案不起作用。

解决方法

可以创建一个 SQL 查询,该查询可以动态聚合平均评论分数然后进行排序,但通常性能不会很好。当数据库可以使用索引时,对记录进行排序是最快的。如果您想对帖子进行分页,则计算顺序必须计算每个条目的值,以便确定要显示哪些元素 - 因此,如果您显示 10,000 条记录中的 10 条记录,则很多浪费处理。

相反,我建议在您的 :review_average 记录中添加一个字段 - 例如 Post,并为其提供索引。在你的帖子类中添加一个计算评论分数的方法:

class Post < ApplicationRecord
  has_many :reviews,inverse_of: :post

  def update_review_average
    update review_average: reviews.average(:raTing)
  end
end

class Review < ApplicationRecord
  belongs_to :post,inverse_of: :reviews

  after_create :update_post
  after_destroy :update_post

  private

  def update_post
    post.update_review_average
  end
end

这样,您的排序就可以用 .order(review_average: :desc) 实现,而且速度会非常快。

大佬总结

以上是大佬教程为你收集整理的通过 Rails 中关联相关的属性来排序数据?全部内容,希望文章能够帮你解决通过 Rails 中关联相关的属性来排序数据?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。