ruby Rails:将包含值的数组Map到模型

yftpprvb  于 2022-12-22  发布在  Ruby
关注(0)|答案(1)|浏览(121)

我遇到了一个问题。在我的应用程序中,我为我的模型创建了以下迁移:

create_table(:calculation, primary_key: [:name, :value1]) do |t|
    t.string :name 
    t.bigint :value1
    t.decimal :value2
    t.decimal :value3
    t.decimal :value4
    t.timestamps
end

从我连接到的API中,我得到了如下所示的响应:

[
    [
        44812342,          // value1
        "723.21000000",    // value2
        "723.21000000",    // value3
        "0",               // UNNESSECARY VALUE (SKIP THIS ONE)
        "723.21000000",    // value4
    ],
    [
        44812342,          // value1
        "723.21000000",    // value2
        "723.21000000",    // value3
        "0",               // UNNESSECARY VALUE (SKIP THIS ONE)
        "723.21000000",    // value4
    ]
]

现在我想写一个作业,在最后使用批量插入将所有接收到的计算写入我的postgres DB。性能真的很重要,所以我想我应该首先将其Map到rails模型,然后调用insert_all并传递包含所有模型的数组。我遇到的问题是结果不包含任何散列。我想到使用这样的东西:

name = 'MyName'
calculationModels = calculationArrays.map do |calculation|
    Calculation.new(
        name: name, 
        value1: calculation[0], 
        value2: calculation[1], 
        value3: calculation[2], 
        value4: calculation[4]
    )
end

Calculation.insert_all(calculationModels)

但我不确定这是否能快速使用,因为在生产环境中,它会执行超过一百万次的计算,所以我的问题是:将这些数组放入数据库的最快方法是什么?

5w9g7ksd

5w9g7ksd1#

当您从API响应时,如下所示:

nested_values = [
  [44812342, "723.21000000", "723.21000000", "0", "723.21000000"],
  [44812342, "723.21000000", "723.21000000", "0", "723.21000000"]
]

然后你可以像这样把记录输入到你的数据库中

nested_values.each do |values|
  Calculation.create!(
    name: 'A NAME',
    value1: values[0],
    value2: values[1],
    value3: values[2],
    value4: values[4],
  )
end

也可以像这样使用insert_all

Calculation.insert_all(
  nested_values.map { |values|
    { 
      name: 'A NAME',
      value1: values[0],
      value2: values[1],
      value3: values[2],
      value4: values[4] 
    }
  }
)

注意,在这两种情况下都需要设置name,因为您将该列定义为主键的一部分。

相关问题