【发布时间】:2015-10-07 01:08:19
【问题描述】:
我想在 postgres 的数组列中插入一些数据。
sample_model = MyModel.create
100.times do
sample_model.array.push [Time.now.to_i, 1234]
sample_model.save
end
这需要 0.5 秒才能完成,而且效率非常低。此代码每次都会覆盖数组。使用 mongoDB 和 mongoid 的相同代码大约需要 0.08 秒才能完成。
sample_model = MyMongoidModel.create
100.times do
sample_model.push(array: [[Time.now.to_i, 1234]])
end
有没有办法像 mongo 那样将元素插入到 postgres 数组列?我什至会考虑任何纯 SQL 解决方案。
【问题讨论】:
-
在 SQL 中,您只需执行
array_column || 1234即可将值附加到数组的末尾。我对Rails 一无所知,但对我来说将模型保存在inside 循环中(顺便说一句,你不会为Mongo 做)看起来非常低效。我希望在循环之后保存模型一次就足够了 -
@a_horse_with_no_name 我应该写什么 ruby 代码来做到这一点?谢谢。它只是一个示例代码。在现实生活中,我需要将一个元素附加到 1000 个元素的数组中,因此覆盖它并不是很有效。
-
内部 PostgreSQL 无法就地更新数组。由于 MVCC 要求,它们总是复制到新行。如果您要大量更新字段,请使用带有连接表的关系设计,而不是数组。您可以通过拆分和连接来更新 SQL 中的数组,但您仍在用新数组编写新行,即使它看起来像更新。
-
@CraigRinger 我试着用连接表来做,我在 0.3 - 0.4 秒内完成了与上面相同的任务。不是很快。
标签: ruby-on-rails arrays ruby postgresql activerecord