1

テーブルに含まれる一部のデータを更新しようとすると、移行に関する問題が発生します。

基本モデルは次のようになります。

ユーザー

  • ユーザー名
  • パスワード
  • …</li>

モデルに列を追加し、既存の行を更新する最初の移行を作成しました。

add_column :users, :deleted, :boolean

User.all.each do |user|
  user.deleted = false
  user.save
end

2 番目の移行では、last_name 列を作成し、username 列の名前を first_name に変更することになっています。

rename_column :users, :username, :first_name
add_column :users, :last_name, :string

2 回目の移行は最初の移行の数日後に作成されたため、開発では問題なく機能しました (そのため、全員が 2 回目の移行のかなり前に最初の移行を適用する十分な時間を確保できました)。

私たちが抱えている問題は、これらの移行をステージング/本番環境で次のモデルにデプロイしようとするときです。

class User < ActiveRecord::Base

  attr_accessible :first_name,
                  :last_name,
                  :password,
                  :password_confirmation,
                  ...

  ...

end

first_name と last_name は attr_accessible に存在しますが、まだ存在しないため、最初の移行は保存時に失敗します。

検証をバイパスしようとしても、問題は解決しません。

この種の問題が発生したことがありますか? SQL を記述せずに完全な Ruby コードに固執したいので、それを回避するのを手伝ってもらえませんか?

4

2 に答える 2

0

を使用しadd_column :users, :deleted, :boolean, :default => falseます。saveこれにより、フラグメントがメソッドに置き換えられます。

于 2012-04-28T14:48:48.253 に答える
0

必要に応じて、ActiveRecord にマイグレーションでデータベースからモデル情報を再ロードさせることができます。

User.reset_column_information

モデルが以前のデータベースの状態と十分に一致していない場合は、生の SQL に切り替えて、executeメソッドを使用して更新を実行することもできます。

execute 'UPDATE users SET deleted=0'
于 2012-04-28T14:50:19.580 に答える