モデルにアソシエーションを追加する方法を知りたいのですが。 2つのモデルを生成するとします
Rails generate model User
Rails generate model Car
ここで、モデルがフォームを取得するように関連付けを追加します
class User < ActiveRecord::Base
has_many :cars
end
class Car < ActiveRecord::Base
belongs_to :user
end
問題は、データベース内のcars_usersテーブルを取得するために、移行によってこの変更を適用する方法ですか?私はコードでそのテーブルを使用する予定です。
belongs_to
関連付けでは、対応するテーブルにassociation_id
列が必要です。車はユーザーに属するため、carsテーブルにはuser_id
列が必要です。これには2つの方法があります。
最初に、モデルを作成するときに列を生成できます
Rails g model car user_id:references
または、Richard Brownの答えのようなモデルを作成した後にuser_idを追加します。 integer
の代わりにreferences
を使用する場合は、インデックスを自分で作成する必要があることに注意してください。
Rails g migration add_user_id_to_cars user_id:integer
次に、生成された移行に追加します
add_index :cars, :user_id
更新:
ジョセフがコメントで述べたように、インデックスを手動で追加する必要性は、Railsの現在のバージョンですでに対処されています。 Rails 4で紹介されたと思います。詳細については、 公式のRails移行ガイド を参照してください。その要点は次のジェネレーターを実行しています
bin/Rails g migration add_user_to_cars user:references
次のような行で移行を作成します
add_reference :cars, :user, index: true
これにより、user_id
列がcarsテーブルに追加され、その列にインデックスが付けられるようにマークされます。
Rails 4(およびおそらくRails 3.2でも)での@jvnillの説明に従ってください。
Rails g migration AddUserToCar user:references
これにより、すべての正しい規則で列とインデックスの両方を追加して、次の移行が作成されます。
class AddUserToCar < ActiveRecord::Migration
def change
add_reference :cars, :user, index: true
end
end
最後に、常に移行を実行します。
rake db:migrate
schema.rb
新しいインデックスとuser_id列を表示します。
移行を生成して関連付けを作成します。
Rails g migration AddUserIdToCars user_id:integer
rake db:migrate
移行ファイル:
class Createuser < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
end
create_table :cars do |t|
t.belongs_to :user, index: true
t.varchar(255) :model
t.varchar(255) :color
end
end
end