您可以在 rails 中使用 find_each 进行分组吗?

Jul*_*lie 5 postgresql ruby-on-rails

我正在尝试编写一个函数,该函数按非常大的表(数百万行)中的某些列进行分组。有什么办法可以解决find_each这个问题,还是因为我不想按 id 列订购,所以这是不可能的?

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

railsfind_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 中的私有batch_order函数之外,还有其他想法吗?

小智 0

我不确定我是否 100% 清楚您要做什么,但您的查询看起来与执行聚合 unique() 相同

SELECT derivable_type, derivable_id FROM "mytable" GROUP BY derivable_type, derivable_id ORDER BY "mytable"."id" ASC;
---- vv
SELECT DISTINCT(derivable_type, derivable_id) FROM "mytable" ORDER BY "mytable"."id" ASC;
Run Code Online (Sandbox Code Playgroud)

您应该能够使用 Active Record 来完成此操作,并结合 find_each (如果Mytable是您的模型):

Mytable.all.group(:derivable_type, :derivable_id).distinct.find_each
# gives => #<Enumerator: #<ActiveRecord::Relation [...]>:find_each({:start=>nil, :finish=>nil, :batch_size=>1000, :error_on_ignore=>nil})>
Run Code Online (Sandbox Code Playgroud)