【问题标题】:Combining distinct with another condition将 distinct 与另一个条件相结合
【发布时间】:2018-03-28 23:01:18
【问题描述】:

我正在将 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_each 时似乎会导致以下错误,

ArgumentError (Primary key not included in the custom select clause):

我想为给定的 salesperson_id 得到一个唯一的 batch_id 数组(?),然后我可以遍历它,就像使用 Rails 3.2 一样。

由于我不明白的原因,看起来我可能需要包含整个记录才能遍历(我的想法是我需要包含主键)?

我正在尝试改写“哪里”,并尝试了以下方法,

sales = SalesActivity.where(salesperson_id: sales_id).select(:batch_id).distinct

但是,组合的 ActiveRecordQuery 将 DISTINCT 应​​用于 salesperson_id 和 batch_id - 这是#FAIL1

另外,因为我仍在使用选择(让 distinct 知道我想要“不同”的列),它当然也仍然只选择 batch_id 列,这是我试图避免的 - 那是 #FAIL2

我怎样才能有效地提取给定 salesperson_id 的所有唯一 batch_id 记录,然后我可以 for_each 它们?

谢谢!

【问题讨论】:

  • 在 postgres 上你可以使用SalesActivity.select('DISTINCT ON(batch_id), id')。但是,如果您只对 batch_id 列感兴趣,我真的不明白这一点 - 只需使用 .pluck 而不是实例化记录。

标签: ruby-on-rails ruby-on-rails-3.2 ruby-on-rails-5


【解决方案1】:

怎么样:

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

可能需要更改wherepluck 的顺序,但pluck 应该返回一个batch_ids 数组

【讨论】:

  • 我确实必须先放 where,但现在返回的是 batch_ds 数组,谢谢!我还必须将 for_each 更改为 each,因为它现在是一个数组,并且 for_each 方法不可用,任何想法如何保持 for_each 批处理效率表示赞赏,但再次感谢!
  • Pluck 将尽其所能。您可以尝试使用select('DISTINCT batch_id') 将其关闭,然后返回到您的for_each。基本上它可以是一个 ActiveRecord 对象而不是一个值数组
  • 好的,刚刚试了一下,它把我带回到第一方(ArgumentError(主键不包含在自定义选择子句中),因为它和我原来的一样,但是顺序改变了,但感谢您的建议。
  • @Snips d'oh 是的,这和你原来的差不多;)因为它是一个 select,所以顺序可能无关紧要。我不在可以玩这个的电脑附近,但你试过find_in_batches而不是for_each吗?
  • 试一试 find_in_batches,然后再次回到原来的问题,但再次感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多