2011-12-03 20 views
4

私はRailsが新しく、これはDjangoの背景から来ています。私はモデルとデータベースのスキーマがRails、オンラインのDjangoでは別々であるという事実に基づいています。しかし、私はまだ移行を把握しています。Rails 3:belongs_to、has_one、Migrations

私の質問はかなり簡単です。マイグレーションを使用してモデルに関係を追加するにはどうすればよいですか?たとえば、私はArtistSongを空のモデルとしてサブクラスActiveRecord::Baseのサブクラスとし、関係はまったくありません。

私はこれやっまで移動する必要があります。

class Artist < ActiveRecord::Base 
    has_many :songs 
end 

class Song < ActiveRecord::Base 
    belongs_to :artist 
end 

をしかし、どのように、私はrails g migrateを使用して、これを反映するために、スキーマを変更できますか?私はRails 3.1.3を使用しています。

答えて

4

あなたは、あなたの移行ファイルにこのような何か外部キーを追加する必要があります:Railsの4にあなたが行うことができ、今

def change 
    create_table :songs do |t| 
    t.references :artist 
    end 

    add_index :songs, :artist_id 
end 
+0

OK - それが既存のテーブルの場合は、 'create_table'以外のものを使用する必要がありますか? –

+3

この場合、 'add_column:songs、:artist_id、:int'を使うこともできますし、上記のような構文でテーブル' change_table'をいくつか変更したい場合もあります。移行の詳細については、http://guides.rubyonrails.org/migrations.html – rabusmar

+0

をご覧ください。私は 'change_table'を使用しましたが、ActiveAdminの" Songs "に行くと、' no such column:artists.song_id'が表示されます。私は何か間違ったことをした?アーティストが多くの曲を持つことができるので、その列は存在してはいけません。 –

6

を:

class AddProcedureIdToUser < ActiveRecord::Migration 
    def change 
    add_reference :users, :procedure, index: true 
    end 
end 

既存のモデル

4

移行を生成することができます

rails g migration AddProcedureIdToUser procedure:references 

ありがとう

+0

それは単数の手順でなければなりませんか? 'rails g migration AddProcedureIdToUserプロシージャ:references'? –

+0

あなたの右の@QuangVan、私は答えを更新しました..それは特異的でなければなりません – prasanthrubyist

関連する問題