Rails:映射数组的值到模型



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

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。性能真的很重要,所以我认为我应该首先映射到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)

,但我不确定如果这是快速使用,因为在生产中它会这样做像超过一百万的计算,所以我的问题是…将这些数组放入数据库的最快方式是什么?

当您从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,因为您将该列定义为主键的一部分。

最新更新