1

一般的问题是,如果将来通过添加没有数据库支持的代码来更改模型,则迁移可能会失败。

场景与此类似:我有这样的迁移:

def change
  Product.find_each do |product|
    product.prices.each do |price|
      price.supplier_part_number = product.supplier_part_number
      price.save
    end
  end
end

迁移被部署到登台。然后将状态机添加到需要状态属性的价格模型中。add_state 迁移被部署到 staging,因此 Price 在 dev 和 staging 上具有 state 属性。

决定将应用程序部署到生产环境。

上面显示的迁移将不会执行,因为 state 属性不存在。那是后来添加的...

因此,迁移似乎受到模型未来状态的影响......

是否有任何宝石或做法来避免这些瓶颈?

4

1 回答 1

0

我找到了一个在 Rails 社区中被广泛接受的解决方案:http: //guides.rubyonrails.org/migrations.html#using-models-in-your-migrations

所以迁移应该改成这样:

class MigrateFieldsFromProductToPrice < ActiveRecord::Migration
  class Price < ActiveRecord::Base
  end

  def change
    Price.reset_column_information
    Product.find_each do |product|
      product.prices.each do |price|
        price.supplier_part_number = product.supplier_part_number
        price.save
      end
    end
  end
end
于 2013-05-30T09:37:37.353 回答