0

モデルClientsと、それに対応するデータベースlastnamefirstname列があります。もともと、の一意性に制約はなく[lastname, firstname]、データベースには現在重複が含まれています。データベースをクリーンアップして、モデルに次のような制約を課したいと思いますvalidates_uniqueness_of :lastname, scope: :firstname

私の頭に浮かぶアイデアは、何らかの方法でデータをバックアップし、空のモデルデータベースに制約を課してから、データを複製して引き戻し、例外から個別に処理できるようにすることです。

しかし、私はここで壁を越えて何かをしているように感じます。

これを行うためのより良い「レールの方法」はありますか?

4

1 に答える 1

1

問題を発見するための真に純粋な Rails の唯一の方法は、すべてのモデルを実行して、それがまだ有効であることを確認することです。たとえば、おおよそ次のとおりです。

Client.all.each do |client|
  unless (client.valid?)
    puts "Client #{client.id} invalid: #{client.errors.full_messages}"
  end
end

all大量のメモリが必要な場合、レコードをロードすることはお勧めできません。ActiveRecord 3.0 はこれに関してより賢く、チャンクでロードするはずですが、現時点ではこれが事実であることを証明できません。

重複データで何をするかについて:

  • 適切なデータベース スナップショット ツールの使用を開始する前に、必ずテーブルをバックアップしてください。
  • 本番データベースでこれを実行する前に、必ずデータのコピーで変更をテストしてください。
  • 信頼性が高く予測可能な方法で操作を実行する Rails 移行を記述して、常に変更を文書化してください。デプロイする前に繰り返しテストしてください。

本番データベースはそのまま定期的なスナップショットの対象になっていると思います。その場合、そこからテスト データを取得できます。そうでない場合は、最優先事項として、そうであることを確認する必要があります。

于 2012-07-04T07:50:37.730 に答える