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

时间:2018-07-19 17:27:00

标签: ruby-on-rails ruby postgresql activerecord activerecord-import

我需要向新数据库中插入大量数据。就像很多数据一样,因此在此查询的上下文中,甚至纳秒也算在内。我正在使用activerecord-import批量插入Postgres,但这对这个问题的范围并不重要。这就是我需要的:

对于现有数据库中的每个记录,我需要一个看起来像这样的数组:

[uuid, timestamp, value, unit, different_timestamp]

问题是uuid存储在我正在循环访问的父对象上以到达该对象,因此#pluck可以用于除此以外的每个组件。更为烦人的是,它存储为实际的uuid,而不是字符串,并且还需要作为uuid(而非字符串)存储在新数据库中。我不确定,但是我认为SELECT内使用#pluck会返回一个字符串。

但是,更大的问题也许是,我需要对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)

但是具有上面概述的参数。

1 个答案:

答案 0 :(得分:1)

我想知道是否可以将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')