Ruby on rails 与另一种情况相结合

Ruby on rails 与另一种情况相结合,ruby-on-rails,ruby-on-rails-3.2,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 3.2,Ruby On Rails 5,我正在将Rails 3.2应用程序迁移到Rails 5.1(不是在时间之前),我遇到了一个where查询问题 在Rails 3.2上运行的代码如下所示 sales = SalesActivity.select('DISTINCT batch_id').where('salesperson_id = ?', sales_id) sales.find_each(batch_size: 2000) do |batchToProcess| ..... 当我在Rails 5.1下运行这段代码时

我正在将Rails 3.2应用程序迁移到Rails 5.1(不是在时间之前),我遇到了一个where查询问题

在Rails 3.2上运行的代码如下所示

sales = SalesActivity.select('DISTINCT batch_id').where('salesperson_id = ?', sales_id)

sales.find_each(batch_size: 2000) do |batchToProcess|
    .....
当我在Rails 5.1下运行这段代码时,当它尝试for_时,似乎会导致以下错误:

ArgumentError (Primary key not included in the custom select clause):
我想为给定的销售人员id创建一个唯一的批处理id数组(?),然后我可以遍历它,就像使用Rails 3.2一样

出于我不理解的原因,看起来我可能需要包含整个记录来遍历(我的想法是需要包含主键)

我试着重新表述“where”,并尝试了以下内容

sales = SalesActivity.where(salesperson_id: sales_id).select(:batch_id).distinct
但是,组合的ActiveRecordQuery将DISTINCT应用于salesperson_id和batch_id,这就是FAIL1

另外,因为我仍然在使用select(让distinct知道我想要“DISTINCE”的列),所以它当然也只会选择batch_id列,这是我试图避免的-这就是失败2

如何有效地提取给定销售人员id的所有唯一批次id记录,以便我可以为每个批次id记录提取唯一批次id记录

谢谢

那么:

SalesActivity.where(salesperson_id: sales_id).pluck('DISTINCT batch_id')

可能需要更改
where
pulk
的顺序,但是pulk应该在postgres上返回一个批处理id数组,您可以使用
SalesActivity。选择('DISTINCT On(batch\u id),id')
。但是如果你只对
批处理id
列感兴趣的话,我真的不明白这一点-只需使用
.pulk
而不是实例化记录。我确实必须先把where放在第一位,但现在它返回批处理id的数组,谢谢!我还必须将for_-each更改为each,因为它现在是一个数组,而for_-each方法不可用,任何关于如何保持for_-each批处理效率的想法都值得赞赏,但再次感谢!“勇气”将抓住它所能抓住的一切。您可以尝试使用
选择('DISTINCT batch\u id')
将其切换出来,然后返回您的for\u。基本上,它可以是ActiveRecord对象,而不是valuesOK数组,只是尝试了一下,它让我回到了第一步(ArgumentError(主键未包含在自定义select子句中)因为它和我原来的一样,但是顺序改变了,但是谢谢你的建议。@Snips d'oh是的,这和你原来的差不多;)因为它是精选的,顺序可能不重要。我不在一台可以玩这个的电脑附近,但您是否尝试过用
批量查找
而不是每个的
?尝试了批量查找,并再次返回原始问题,但再次感谢您的建议。