gpt4 book ai didi

ruby-on-rails - 比较 2 个大型 ActiveRecord 关系进行排序

转载 作者:行者123 更新时间:2023-12-04 15:04:32 24 4
gpt4 key购买 nike

我有 2 个大型 ActiveRecord::Relations,每个都有 10 或 100 万条用户记录,我们称它们为 ar1ar2。我想对 ar1 进行排序,以便所有也出现在 ar2 中的记录都放在 ar1 的前面。

使用 sort_by 很容易做到这一点,但是由于记录的数量太大,在某些情况下 sort_by 需要一分钟以上的时间来执行。

我想我最好的选择是尝试通过 ActiveRecord 以这种方式对记录进行排序,但我找不到任何方法来做到这一点。有没有一种方法可以使用 ActiveRecord 或其他方法快速完成此结果?

谢谢!

编辑:

这是我使用的排序代码:ar1.sort_by { |e| ar2.index(e) || float ::无穷大

最佳答案

我首先要说的是,您实际上并不需要 sort_by!

您可以通过以下方式实现相同的目的:

ar1.sort_by { |e| ar2.index(e) || Float::INFINITY }

采用类似的方法:

result = ((ar2 & ar1) + ar1).uniq

哪个更快。

这里有一个简单的基准来支持这个建议。

require 'benchmark'
ar1 = 100_000.times.map {|x|( 100_000_000 * rand).to_i }.uniq
ar2 = 100_000.times.map {|x|( 100_000_000 * rand).to_i }.uniq

puts ar1.size
puts ar2.size

Benchmark.bm do |x|
result_2 = []
result_1 = []
x.report('sort') do
result_2 = ar1.sort_by { |e| ar2.index(e) || Float::INFINITY }
result_2.size
end

x.report('array') do
result_1 = ((ar2 & ar1) + ar1).uniq
result_1.size
end

puts result_1.size
puts result_2.size
puts result_1 == result_2
end

给出了一些不错的结果

       user     system      total        real
sort 45.287331 0.012233 45.299564 ( 45.539641)
array 0.010782 0.004000 0.014782 ( 0.014792)

我省略了一些验证输出。

现在是 ActiveRecord 部分。根据 ar2 集合大小,您可以检索 ID 并以此对第二个查询进行排序。假设 ar1 = first_query.order(first_order)

ar2_ids = second_query.pluck(:id)

ar1 = first_query.order("FIELD(id, #{ar2_ids.join(',')}), first_order")

这将首先保留 ar2,然后保留其他的。您需要调查 ar2 的大小,因为根据您的数据库,提供包含数千个 ID 的订单查询可能不是最佳选择。

在对这个问题进行一些思考之后,我会选择数组操作方法来使事情变得简单。我不会选择数据库解决方案,因为它很可能会扰乱查询的可读性,太多了。

这完全取决于您的问题的细节!我希望这会有所帮助。

关于ruby-on-rails - 比较 2 个大型 ActiveRecord 关系进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66405484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com