是否有针对我的情况使用 ActiveRecord#Pluck 的有效方法?

Is there an efficient means of using ActiveRecord#Pluck for my situation?

我需要将大量数据插入新数据库。例如,lot 数据,因此在此查询的上下文中,即使纳秒也很重要。我正在使用 activerecord-import 批量插入到 Postgres 中,但这对于这个问题的范围来说并不重要。这是我需要的:

对于现有数据库中的每条记录,我需要一个如下所示的数组:

[uuid, timestamp, value, unit, different_timestamp]

问题是 uuid 存储在我循环访问该对象的父对象上,因此 #pluck 对除此之外的每个组件都有效。更烦人的是,它存储为实际的 uuid,而不是字符串,并且需要在新数据库中也存储为 uuid(而不是字符串)。我不确定,但我 认为 #pluck 中使用 SELECT 将 return 一个字符串。

但也许更大的问题是我需要在再次插入之前对value的值进行转换。这是一个简单的转换,实际上只是 value / 28 或其他东西,但我发现很难将其转换为 #pluck 而不添加 #each_with_object 或其他东西(这会大大减慢速度)

这是现在的查询。根据上面概述的阻塞加载整个记录对我来说似乎真的很愚蠢。我希望有一个替代方案。

Klass.find_each do |klass|
    Data.where(token: klass.token).find_each do |data|
      data << [
        klass.uuid,
        data.added_at,
        data.value / conversion,
        data.unit, 
        data.created_at
      ]
    end
end

不,父级和 Data 现在没有关联,这不是一个选项,所以我不能急切加载或只调用 Klass.data(他们将在此之后链接过渡)。

理想情况下,这就是我要找的东西:

Data.where(token: klass.token).pluck(:added_at, :value, :unit, :created_at)

但是使用上面列出的参数。

我想知道你是否可以将 SQL JOINpluck:

结合起来
Klass
  .joins('INNER JOIN datas ON datas.token = klasses.token')
  .pluck('klasses.uuid', 'datas.added_at', "datas.value / #{conversion.to_f}", 'datas.unit', 'datas.created_at')