创建 rails 迁移并根据模型中的方法填充现有值

Creating a rails migration and and populated existing values based off of a method within a model

我对一种方法进行了更改,该方法定义了我想添加到数据库中的特定值。然后我创建了一个迁移以增加该值。然而,我遇到的问题是,通过我所做的,它填充了任何新值,但我有几百个旧值需要填充,但我一直无法填充这些值。

这是我的代码,这是一个名为 OrderTransactions 的模型

def set_pricing_amounts
  pricing_service = PricingService.new(visit: visit)
  self.base_price = pricing_service.base_price
end

里面的base_price是我需要的,最终是在PricingService里面创建的。我认为我不需要显示有关 PricingService 中内容的任何信息(如果我让我知道)

我最初的迁移是这样的:

class AddedBasePriceToOrderTransactions < ActiveRecord::Migration
  def change
    add_column :order_transactions,  :base_price, :integer
  end
end

我试过类似的东西

OrderTransaction.all.each do |product|
  product.update_attributes!(:base_price => base_price)
end

这更新了我所有的订单交易,但给它们所有的值 1.....这是不正确的。

我也试过了

OrderTransaction.all.each do |zg|
  zg.update_attributes(base_price: PricingService(:visit, visit).base_price)
end

我觉得这可能是一个更接近的方法,但是 visit 在迁移中没有被识别,所以我无法让它被识别。

如果有人能看一下,我将不胜感激!

如果 set_pricing_amounts 是一个 public 方法,您可以这样做:

OrderTransaction.all.each do |product|
  product.set_pricing_amounts
  product.save!
end

(或者如果它是私有的,您可以改为 product.send(:set_pricing_amounts)

如果您想调用定价服务,那么这应该可行:

OrderTransaction.all.each do |order|
  order.update_attributes base_price: PricingService.new(visit: order.visit).base_price
end

旁注:如果您有很多记录要迁移,您应该考虑使用 OrderTransaction.all.find_each 而不是 OrderTransaction.all.each,但这只是一个提示,与问题没有直接关系.