web-dev-qa-db-ja.com

既存のモデルに関連付けを追加する

モデルにアソシエーションを追加する方法を知りたいのですが。 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テーブルを取得するために、移行によってこの変更を適用する方法ですか?私はコードでそのテーブルを使用する予定です。

50
Andrew

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テーブルに追加され、その列にインデックスが付けられるようにマークされます。

71
jvnill

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列を表示します。

19
SimonW

移行を生成して関連付けを作成します。

Rails g migration AddUserIdToCars user_id:integer
rake db:migrate
7
Richard Brown

移行ファイル:

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
0
vinoth