Rails 3.如何对所有记录执行保存操作?

leo*_*nel 14 ruby activerecord ruby-on-rails

我有一个名为货物的模型.我在发货表中添加了一些列,并且有些列应该在保存之前计算.所以现在我必须编辑每个记录并点击更新,以便新列计算和添加数据.

那么有没有办法对所有货件记录执行全局保存,以便可以添加数据?

before_save :default_values
  def default_values
    self.volume = 1 unless self.volume
    self.kilograms = 1 unless self.kilograms
    self.status = "Open" if self.status.blank?
      if self.mode == "Air"
        self.estimated_transit_time = self.etd_origin + 7.days
        self.eta_place_of_delivery = self.etd_origin + 7.days
      else
        self.estimated_transit_time = self.etd_origin + (Place.find_by_city(self.place_of_loading).transit_time).days
        self.eta_place_of_delivery = self.etd_origin + (self.estimated_transit_time).days
      end
  end
Run Code Online (Sandbox Code Playgroud)

Vic*_*tor 43

一个班轮:

Shipment.find_each(&:save)
Run Code Online (Sandbox Code Playgroud)

  • 所有这些解决方案都可以调用数据库.只有像`update_all`这样的调用才能进行集合更新会更有趣. (11认同)

bas*_*gys 16

批量加载数据.切勿一次装入所有物品

Shipment.find_each(:batch_size => 1000) do |shipment|
  shipment.save!
end
Run Code Online (Sandbox Code Playgroud)

然后,当您必须在迁移后计算某些字段或其他内容.只需将此作业添加到迁移中即可.

  • @ affinities23当然!Model.all将一次加载所有记录.如果您有少量记录,这将正常工作,但会变得越来越慢,如果所有记录不能同时适合内存,最终会中断.find_each将按批量加载(在我的示例中,内存中加载的记录不超过1000条),这样可以防止我刚才描述的问题. (7认同)
  • 注意分享使用批次的原因而不是Model.all.each {| mdl | mld.save!}? (3认同)

MrD*_*anA 4

您可以创建这样的方法:

def self.save_all
    Shipment.all.each { |shipment| shipment.save! }
end
Run Code Online (Sandbox Code Playgroud)

然后只需调用:

Shipment.save_all
Run Code Online (Sandbox Code Playgroud)