Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将元素插入PostgreSQL数组而不覆盖它_Ruby On Rails_Arrays_Ruby_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails 将元素插入PostgreSQL数组而不覆盖它

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

我想在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解决方案:

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个元素的数组中插入一个新元素,然后保存该对象。