gpt4 book ai didi

ruby-on-rails - 你可以在 rails 中使用 find_each 进行分组吗?

转载 作者:行者123 更新时间:2023-11-29 11:49:24 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数按一个非常大的表(数百万行)中的某些列进行分组。有什么方法可以让 find_each 处理这个问题,或者如果我不想按 id 列排序是不可能的吗?

我查询的 SQL 是:SELECT derivable_type, derivable_id FROM "mytable"GROUP BY derivable_type, derivable_id ORDER BY "mytable"."id"ASC;

rails find_each 使用 reorder 语句自动添加 ORDER BY 子句。我尝试将 SQL 更改为:

SELECT MAX(id) AS "mytable"."id", derivable_type, derivable_id FROM "mytable"GROUP BY derivable_type, derivable_id ORDER BY "mytable"."id"ASC;

但这也行不通。除了编写我自己的 find_each 函数或覆盖 batches.rb 中的私有(private) batch_order 函数之外,还有其他想法吗?

最佳答案

至少有两种方法可以解决这个问题:

我。使用子查询:

# query the table and select id, derivable_type and derivable_id
my_table_ids = MyTable
.group("derivable_type, derivable_id")
.select("MAX(id) AS my_table_id, derivable_type, derivable_id")

# use subquery to allow rails to use ORDER BY in find_each
MyTable
.where(id: my_table_ids.select('my_table_id'))
.find_each { |row| do_something(row) }

二。编写自定义 find_each 函数

rows = MyTable
.group("derivable_type, derivable_id")
.select("derivable_type, derivable_id")

find_each_grouped(rows, ['derivable_type', 'derivable_id']) do |row|
do_something(row)
end

def find_each_grouped(rows, columns, &block)
offset = 0
batch_size = 1_000
loop do
batch = rows
.order(columns)
.offset(offset)
.limit(limit)

batch.each(&block)

break if batch.size < limit
offset += limit
end
end

关于ruby-on-rails - 你可以在 rails 中使用 find_each 进行分组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45067082/

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