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

时间:2017-03-10 13:23:24

标签: ruby-on-rails migration rails-migrations

我对一个方法进行了更改,该方法定义了我想在数据库中添加的特定值。然后,我创建了一个迁移以添加到该值。然而,我遇到的问题是,我已经完成的任务,它填充了任何新的值,但我有几百个旧的值需要填充,我在填充这些值时遇到了麻烦。

这是我的代码的样子,这是一个名为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在迁移中无法识别,因此我无法识别它。

如果有人可以看看这个,我真的很感激!

1 个答案:

答案 0 :(得分:1)

如果set_pricing_amounts是公共方法,您可以这样做:

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,但这只是一个提示,而不是直接与questino有关。