Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用关联表ruby的Pull按计数排序_Ruby On Rails_Ruby_Postgresql_Activerecord - Fatal编程技术网

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的观点,计数器缓存将是一种可行的方法。