【发布时间】: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