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

移行がステージングにデプロイされます。次に、state 属性を必要とする状態機械が Price モデルに追加されます。add_state 移行はステージングにデプロイされるため、Price には dev とステージングの状態属性があります。

アプリを本番環境にデプロイする決定が下されます。

また、状態属性が存在しないため、上記の移行は実行されません。後から追加です...

そのため、移行はモデルの将来の状態に影響されるようです...

この種のボトルネックを回避するための宝石やプラクティスはありますか?

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 に答える