2009-06-09 14 views
16

これは単純なものでなければなりませんが、それは私のナットを運転しています!
私はその後Railsは移行中にレコードを変更することはできません

class SubjectsTextField < ActiveRecord::Migration 
    def self.up 
    add_column :users, :subjects, :text 

    User.find(39).update_attribute :subjects, "hey there" 
    end 

    def self.down 
    remove_column :users, :subjects 
    end 
end 

列が作成されたレコードを更新したいが、私は、レコード39をチェックするために行くとき、それは被験者のフィールドがnullだと「ちょっとそこに」言っていない移行を持っています。移行中にエラーはスローされず、update_attribute行は動作したかのようにtrueを返します。

この行は、コンソールで完璧に動作し、期待した効果があります。私は2番目のマイグレーションでupdate_attributeラインを入れてみました

User.find(39).update_attribute :subjects, "hey there" 

を。 1つの「rake db:migrate」で両方を同時に吹き飛ばしても、それはまだ機能しません。

しかし、ここには奇妙な部分があります。 2つの別々のマイグレーションを実行する場合は、「rake db:migrate VERSION = 10」と言うだけで列を作成し、次に「rake db:migrate」を使用して属性を更新します。IT WORKS!

何が起こっているのか...移行中にレコードを変更するにはどうすればよいですか?私はこれを過去にしばしばやっていることを覚えているようです。多分Rails 2.3.2とは何か違うのでしょうか?

ありがとうございます! ブライアン

答えて

33

てみてください...非常に明確です。 add_columnと更新の間にこれを追加します。

User.reset_column_information 

ActiveRecord::Migrationページの「そのテーブルを変更した後のモデルの使用」を参照してください。

+0

それは感謝のマイケルでした!私はこの前に遭遇したことはないと信じられません...万人に感謝します。 –

+0

私も同様の問題がありました。誰かがモデルを作成した移行でt.timestampを使用しなかったが、t.datetime:updated_atを実行した。ですから、created_atを追加して、既存のオブジェクトのcreated_atをupdated_atの現在の値に初期化したいのですが、常にnilでした。変わったことは、Time.nowを使ってみるとうまくいきました。 とにかく、マイケルに感謝します。あなたの投稿は多くの助けになりました!それは私のためにそれを固定した。 – bratsche

+0

マイケルにapiページへのリンクをありがとう:他のページで#reset_column_informationメソッドが廃止されていることが判明したので、更新しておくと便利です。 – Attilio

0

このように最初の移行で2つを結合すると、それは機能しますか?

class SubjectsTextField < ActiveRecord::Migration 
    def self.up 
    add_column :users, :subjects, :text 

    User.find(39).update_attribute "subjects", "hey there" 
    end 

    def self.down 
    remove_column :users, :subjects 
    end 
end 
+0

Nopeはこのように引用符で動作しません。返信いただきありがとうございます。 –

1

この構文は、あなたが新しい列を使用する前に変更したモデルにreset_column_informationを呼び出す必要がchange_table

class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
    def self.up 
    change_table :users do |t| 
     add_column :users, :subjects, :text 
    end 
    User.find(39).update_attribute "subjects", "hey there" 
    end 

    def self.down 
    remove_column :users, :receive_newsletter 
    end 
end 
関連する問題