2011-06-24 11 views
0

Ruby on Railsチュートリアルの作業中です。マイグレーションを生成したときに、私のカラム名のスペルが間違っていたことに気がつきました。私がアソシエーションを使って作業しようとすると、私はこのエラーを受け取ります。Ruby on Rails、Active Record Updating

first_page = Page.new(:name => "first page", :permalink => 'first', :position => 1) 
ActiveRecord::UnknownAttributeError: unknown attribute: position 
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1564:in `attributes=' 
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1560:in `each' 
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1560:in `attributes=' 
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1412:in `initialize' 
    from (irb):5:in `new' 
    from (irb):5 
>> 

私の質問は、アクティブなレコードを正しい位置のスペルで更新する方法です。私はそれを私のスキーマファイルで変更しました。

答えて

1

を実行し、正しいスペルを持っているあなたの最初の移行を修正:すべての空の開発DBを作成し、これはあなたの開発データベースが削除されます

$ rake db:migrate:reset 

、および再実行(およびその中の任意のデータを!)それに対する定義済みの移行

+0

RubySoloありがとうございます。 –

+0

私は確かにあなたのプロダクションサーバーではなく、あなたの開発ワークステーションで(特にチュートリアルで働いているとき)、それはちょうど良いことです。 – rubysolo

+0

データベースを削除した後、すべての移行を再実行します。定義により、データベースはすべての移行の結果と一致します。 – rubysolo

1

手動ではなくスキーマを更新するには、移行機能を使用する必要があります。

ここで詳細検索:、それを修正して再度実行します。:通常私は(ロールバックすくいデシベルで)移行をロールバックhttp://guides.rubyonrails.org/migrations.html

1

スキーマを手動で編集しないでください。それはあなたのデータベーステーブルを変更しません。あなたの条件に少し不明瞭であることだ、あなたの質問「どのように私は、アクティブレコードを更新しない」と答えるために

rename_column :table, :old_column_name, :new_column_name 

は単純に、列の名前を変更するための新しい移行を実行します。 「データベーステーブルを更新するにはどうすればよいですか」という意味ですか?その場合は、移行をロールバックして修正するか、新しい移行を実行します。いずれも動作しますが、ロールバックは運用モードでのデータ損失を引き起こす可能性があります(私はあなたのケースではないと想定しています)。

モデルを変更するには、単にテキストエディタでrubyファイルを開いて変更します。

1

すでにあなたの移行をプッシュ/コミットした場合、あなたが新しい移行の問題を解決するために優れているので、他の人がすでに@Edヘイウッドから、それを実行するよりも、可能である:

rename_column :table, :old_column_name, :new_column_name 

そうした場合、この移行を共有していない場合は、新しい移行を作成するのではなく、移行を修正できます。最後の移行に

rake db:rollback 

を元に戻すにはその後、あなたの移行を修正し、あなたが手動、それはあなたが移行を実行するたびに更新され、あなたのschema.rbを編集することはありません再びrake db:migrate

それを実行します。編集しない場合は、問題を修正したときに正しいはずです。