1

テーブルに含まれる一部のデータを更新しようとすると、移行に関する問題が発生します。Rails:attr_accessibleを使用すると、移行中のデータを更新する方法は?

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

ユーザー

  • ユーザ名
  • パスワード
  • ...

私たちはモデルに列を追加する最初の移行を作成し、既存の行を更新してください:

add_column :users, :deleted, :boolean 

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

二移行がlast_name列を作成し、FIRST_NAMEにユーザー名列の名前を変更することになっている:

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

二移行は数日最初の1(後に作成されたため、それは開発中の任意の問題もなく働いていました誰もが最初の井戸を2番目の井戸の前に適用するのに十分な時間があった)。

我々は以下のモデルにステージング/生産でそれらの移行にそれを展開しようとすると、我々が持っている問題は次のとおりです。

class User < ActiveRecord::Base 

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

    ... 

end 

FIRST_NAMEとLAST_NAMEがまだものの存在しないため、最初の移行がセーブに失敗します彼らはattr_accessibleに存在しています。

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

このような問題がありましたか?SQLを書き込まずに完全なルビコードに固執したいので、この問題を回避できましたか?

答えて

0

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

+0

この例ではこれを行うことができます。しかし、単純な例です。デフォルト値の背後にあるロジックが複雑で、ハードコードされたデフォルト値を設定することはできません.Railsは作業自体を行わなければなりません。 –

+0

デフォルト値はすべての新しいレコードで常に同じです。それ以外の場合は、デフォルトではありません。より複雑な状況では、純粋なSQLを使用します。 –

0

あなたは必要な時はいつでもあなたの移行中のデータベースからモデル情報を再ロードするのActiveRecordを強制することがあります。

User.reset_column_information 

あなたのモデルは、以前のデータベースの状態と十分に整合性がない場合は、あなたも実行するために、生のSQLに切り替えることがexecuteメソッドを使用した更新:

execute 'UPDATE users SET deleted=0' 
関連する問題