Ruby on rails 使用关联表ruby的Pull按计数排序
目前,我的代码如下所示:Ruby on rails 使用关联表ruby的Pull按计数排序,ruby-on-rails,ruby,postgresql,activerecord,Ruby On Rails,Ruby,Postgresql,Activerecord,目前,我的代码如下所示: Author.joins(:books).group("authors.id").order("count (authors.id) desc") ORDER BY id=1 DESC, id=3 DESC, id=2 DESC, id=4 DESC 按作者写了多少本书来排序。然而,books是一个非常大的数据库表。因此,要在不使用.joins的情况下加快速度,如何编写与.pullc语句配合使用的内容来获取books.id,例如: Author.order("co
Author.joins(:books).group("authors.id").order("count (authors.id) desc")
ORDER BY id=1 DESC, id=3 DESC, id=2 DESC, id=4 DESC
按作者写了多少本书来排序。然而,books是一个非常大的数据库表。因此,要在不使用.joins的情况下加快速度,如何编写与.pullc语句配合使用的内容来获取books.id,例如:
Author.order("count (id: Book.uniq.pluck(:author_id)) desc")
(此代码导致语法错误)
这主要是一个如何编写和格式化的问题吗?或者,有没有更好的方法来重构这种类型的语句?您可以阅读下面的问题。唯一可用的选项(不包含join和创建其他Postgres函数)是如下所示的使用顺序:
Author.joins(:books).group("authors.id").order("count (authors.id) desc")
ORDER BY id=1 DESC, id=3 DESC, id=2 DESC, id=4 DESC
您可以在Rails中构建这样的查询:
ids = Book.group(:author_id).order("COUNT(*) DESC").pluck(:author_id)
order_by = ids.map { |id| "id=#{id} DESC" }.join(", ")
Author.order(order_by)
这会奏效的。尽管在Author表包含大量记录的情况下,出于性能原因,最好使用a(如@tegon所建议的)。您可以阅读有关此问题的内容。唯一可用的选项(不包含join和创建其他Postgres函数)是如下所示的使用顺序:
Author.joins(:books).group("authors.id").order("count (authors.id) desc")
ORDER BY id=1 DESC, id=3 DESC, id=2 DESC, id=4 DESC
您可以在Rails中构建这样的查询:
ids = Book.group(:author_id).order("COUNT(*) DESC").pluck(:author_id)
order_by = ids.map { |id| "id=#{id} DESC" }.join(", ")
Author.order(order_by)
这会奏效的。尽管在Author表包含大量记录的情况下,出于性能原因,最好使用a(正如@tegon所建议的那样)。如果books表太大,我建议您使用a。通过这种方式,您可以轻松地按books\u count进行订购,而无需查看books表。我认为pull将比这里的join更糟糕,因为它将强制执行相关子查询。数据库必须为每个作者执行选择。我同意@tegon的观点,计数器缓存是一个不错的选择。如果书桌太大,我建议你使用一个。通过这种方式,您可以轻松地按books\u count进行订购,而无需查看books表。我认为pull将比这里的join更糟糕,因为它将强制执行相关子查询。数据库必须为每个作者执行选择。我同意@tegon的观点,计数器缓存将是一种可行的方法。