你能用rails中的find_each做一组吗?

时间:2017-07-12 20:37:32

标签: ruby-on-rails postgresql

我正在尝试编写一个函数,该函数按非常大的表(数百万行)中的某些列进行分组。有没有办法让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中的私有batch_order函数之外的任何想法?

2 个答案:

答案 0 :(得分:1)

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

<强>予。使用子查询:

html { font-size: 1rem; }

@media (min-width: 576px) {
    html { font-size: 1.25rem; }
}
@media (min-width: 768px) {
    html { font-size: 1.5rem; }
}
@media (min-width: 992px) {
    html { font-size: 1.75rem; }
}
@media (min-width: 1200px) {
    html { font-size: 2rem; }
}

<强> II。编写自定义find_each函数

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <h1>Hello World</h1>
        </div>
    </div>
</div>


<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

答案 1 :(得分:0)

我不确定我是否100%清楚你要做的事情,但你的查询看起来与做一个不同的聚合()

相同
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;

您应该可以使用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})>