Ruby on rails 将元素插入PostgreSQL数组而不覆盖它
我想在postgres中的数组列中插入一些数据Ruby on rails 将元素插入PostgreSQL数组而不覆盖它,ruby-on-rails,arrays,ruby,postgresql,activerecord,Ruby On Rails,Arrays,Ruby,Postgresql,Activerecord,我想在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.tim
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解决方案:
class MyModel < ActiveRecord::Base
has_many :time_entries, dependent: :destroy, inverse_of: :my_model
end
class TimeEntry < ActiveRecord::Base
belongs_to :my_model, inverse_of :time_entries
validates_presence_of: time
end
100.times {MyModel.last.time_entries.create(time: Time.now)}
classmymodel
SQL解决方案:
class MyModel < ActiveRecord::Base
has_many :time_entries, dependent: :destroy, inverse_of: :my_model
end
class TimeEntry < ActiveRecord::Base
belongs_to :my_model, inverse_of :time_entries
validates_presence_of: time
end
100.times {MyModel.last.time_entries.create(time: Time.now)}
classmymodel
你读过这篇文章吗:
我认为选项3-单个体量插入是您所需要的。您是否阅读过以下内容:
我认为选项3—您需要的是单个大规模插入。在SQL中,您只需执行
array|u column | 1234
即可将值附加到数组的末尾。我对Rails一无所知,但在我看来,将模型保存在循环中的效率非常低(Mongo btw不需要这样做)。我希望在测试结束后保存一次模型就足够了loop@a_horse_with_no_name我应该写什么ruby代码来实现它?谢谢。这只是一个示例代码。在现实生活中,我需要将一个元素附加到一个包含1000个元素的数组中,所以覆盖它并不是很有效。在内部,PostgreSQL无法就地更新数组。由于MVCC要求,它们总是复制到新行。如果要大量更新字段,请使用带有联接表的关系设计,而不是数组。您可以通过拆分和连接来更新SQL中的数组,但您仍在使用新数组编写新行,即使它看起来像是更新。@CraigRinger我尝试使用联接表来完成此操作,我在0.3-0.4秒内完成了与上面相同的任务。不是很快。在SQL中,只需执行array|u column | 1234
即可将值附加到数组的末尾。我对Rails一无所知,但在我看来,将模型保存在循环中的效率非常低(Mongo btw不需要这样做)。我希望在测试结束后保存一次模型就足够了loop@a_horse_with_no_name我应该写什么ruby代码来实现它?谢谢。这只是一个示例代码。在现实生活中,我需要将一个元素附加到一个包含1000个元素的数组中,所以覆盖它并不是很有效。在内部,PostgreSQL无法就地更新数组。由于MVCC要求,它们总是复制到新行。如果要大量更新字段,请使用带有联接表的关系设计,而不是数组。您可以通过拆分和连接来更新SQL中的数组,但您仍在使用新数组编写新行,即使它看起来像是更新。@CraigRinger我尝试使用联接表来完成此操作,我在0.3-0.4秒内完成了与上面相同的任务。不是很快。这不是我的情况。上面的代码只是一个示例。我需要在已经有1000个元素的数组中插入一个新元素,然后保存该对象。这不是我的情况。上面的代码只是一个示例。我需要在已经有1000个元素的数组中插入一个新元素,然后保存该对象。