2010-12-02 3 views
25

にモデル参照の追加:ピエロ&ラビット私は既存のモデルを考えるのRails 3の2つの<em>既存</em>クラス</p> <p>との関係加えるアプローチする「正しい」やり方知りたいのですが、既存のRailsのモデル

RabbitからClownへのリファレンス(belongs_to)を追加したいと思います。

rails g migration AddClownToRabbits clown:reference 

私のように見える移行できます::

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown, :reference 
    end 

    def self.down 
    remove_column :rabbits, :clown 
    end 
end 

この移行にrake db:migrateた後、私はSQLite3ののdevelopment.dbを調べ、新しい列を参照:私は、マイグレーションを生成しようとしていることから始める"clown" reference

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown_id 
    end 

    def self.down 
    remove_column :rabbits, :clown_id 
    end 
end 

は私が"clown_id" integer列と同じように見えたの移行を期待していたと思います

私は確信しています:参照は "t.references:clown"と同等であるはずですが、ドキュメントが見つかりません(大きな驚き)。参照:への無参照して... Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

:APIはADD_COLUMN言います。

+1

ドキュメントについては(ドキュメント内の参考文献も参照してください)、http://guides.rubyonrails.org/getting_started.htmlを参照して、7.1モデルの生成までスクロールし、その見出しの下にあるコードスニペットを見てください。 *:reference *ではなく*:references *であることがわかります。 – iconoclast

答えて

18

、そしてピエロでhas_manyの、あなたが移行を行うことができますあなたはdocsで見ることができます。

+0

素晴らしい!ありがとう!私はちょっと期待していましたが、それをどこに置くのかとまだ苦しんでいます...「裸の」移動で?だから、おそらく 'rails g migration AddClownToRabbits'を実行し、手で残りの部分を編集しますか? – Meltemi

+0

私はちょうど今テストしました...そしてそれは私にあなたが言及したように私が編集することができる適切なタイムスタンプファイル名を持つ空白のスレートを与えます。ありがとう – Meltemi

+1

私は "参照"を使用しても列にインデックスを追加するという印象を受けていますが、この方法ではindex => trueを追加する必要があります。このようなもの\t \t add_reference:rabbits、:clown、:index => true – TheJKFever

5

私はこのアイデアがどこにあるのか分かりませんが、add_columnで何をしても構いません。あなたが望む振る舞いを得るには、あなたが述べたようにt.refences :clownをしなければならないでしょう。バックグラウンドでは、@base.add_column(@table_name, "#{col}_id", :integer, options)と呼びます。

hereを参照してください。

EDIT:

私は、私はあなたの混乱のソースを見ることができると思います。メソッド呼び出しt.referenceを見て、t.integert.stringなどのコールが存在し、それらがデータ型であるため、データ型であるとみなしました。それは間違っている。参照はデータ型ではなく、単にメソッド名であり、t.renameに似ています。あなたが使用できるエッジレール(4.0)を使用している場合は

add_column :rabbit, :clown_id, :integer 
+0

混乱して申し訳ありません...学習...そして、まあ、これはあなたが学ぶ方法です。ありがとう!だから、私の質問に答えるためには、適切なジェネレータコマンドは何ですか...ジェネレータがタイムスタンプを付けられているために開始する必要があると仮定して、ファイル名を手動で作成する必要はないと思いますか? 'rails g migration AddClownToRabbits clown:reference'は、上記の悪い迷惑メールを私に与えます。 – Meltemi

+0

@Meltemi:参照のみを追加するジェネレータコマンドはありません。すべてのジェネレータは生成されていることを覚えておいてください。それは参照を追加することができない大きな問題ではない、あなたはそれを自分で行う必要があります。 – ryeguy

52

rails generate migration AddAddressRefToContacts address:references 

あなたがウサギにbelongs_toのを設定した後

+2

すごくパウロです。これは機能します。どうも! – Dru

+3

最後に!これはRails 2以降にはありませんでした –

+0

あなたが好きな場合は 'address:belongs_to'を使うこともできます –