我有一个问题。在我的应用程序中,我为我的模型创建了以下迁移:
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
,因为您将该列定义为主键的一部分。