2011-07-10 4 views
1

Railsの移行を覚え始めるところです。私はname [文字列](および自動生成id列)のtagsというテーブルを持っています。テーブルをname列をidと主キーとして使用するように移行したいと思います。既存のすべてのレコードが新しいスキーマで動作することを確認するには、どうすればよいですか?Railsの移行:idと異なる列を使用

答えて

3

アプローチは簡単ですが、実行は危険に見えます。マイグレーションを稼働させるのはかなり単純ですが、ダウンしていますか?わからない。

  1. あなたの名前の欄には、すべてのレコード
  2. 全体で固有であることを確認して、あなたのオブジェクトへの参照を格納し、名前にIDから、それらを変更する他のすべてのオブジェクトを検索します。

この列が一意でないことが分かった場合は、名前を重複したものなどの名前+ idと同じように変更する予定があります。これはすべて、移行から行うことができます。

私は、これはタグテーブルの周りにあなたのモデルであると仮定し、あなたが一例として道

に沿って見つける問題を解決するためにそれを使用するが、id列を残すだけお勧め:

class Tag < ActiveRecord::Base 
end 

を想定

class Thing < ActiveRecord::Base 
    has_one :tag 
end 

物事テーブル上TAG_ID列があります:あなたは、Tagモデルとシンプルな関連を持っている、少なくともこの他のモデル、事を、持っています。私は、これは、これらのものとの間の関連性は、新しいカラムに通してあることのRailsを告げる

class Thing < ActiveRecord::Base 
    has_one :tag, :foreign_key => "tag_name" 
end 

...この新しい列を指す外部キーを持つように関連付けを変更、タグ名と呼ばれる列を追加したいです。慣例により、 "tag_id"が検索されます。

は、移行に入ることができ、この変更を考える:

add_column :things, :tag_name, :string 

Thing.all.each do |thing| 
    if thing.tag 
    thing.tag_name = thing.tag.name 
    end 
end 

remove_column :things, :tag_id 

これは、迅速かつ汚い例ですが、私は何かを見逃しているかもしれません。重要なことは、新しい列を追加し、関連付けを移動し、古い列を削除することです。

モデルが多対多関連または多型関連に関係する場合のような他のシナリオがありますが、一般的なアプローチはこれらのケースで同様です。

+0

あなたは実際にコードを与えていません – apneadiving

+1

はい、私はいくつかを追加することができますが、彼はどんなモデルや他の例を扱うこともできませんでした。私に数分を与えると私は一緒に何かを置くでしょう:) – jaydel

+0

ありがとう! id列を残し、名前列でタグを検索することについてアドバイスをします。特に、複数のユーザーが独自のタグを作成することになります。 – Chetan

関連する問題