61

モデルに関連付けを追加する方法を知りたいです。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 テーブルを取得するために、移行によってこの変更を適用する方法です。そのテーブルをコードで使用する予定です。

4

4 に答える 4

80

belongs_to関連付けassociation_idには、対応するテーブルの列が必要です。車はユーザーに属しているため、車のテーブルには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 の公式ガイド for migrations を参照してください。その要点は、次のジェネレーターを実行することです

bin/rails g migration add_user_to_cars user:references

次のような行で移行を作成します

add_reference :cars, :user, index: true

これにより、cars テーブルに列が追加user_idされ、その列がインデックス付けされるようにマークされます。

于 2013-03-13T12:33:11.517 に答える
21

Rails 4 (およびおそらくRails 3.2でも)での@jvnillの説明に従って、次のようにすることもできます(id部分を避け、正確な慣習を覚えておいてください):

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

于 2014-06-06T14:35:24.037 に答える
9

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

rails g migration AddUserIdToCars user_id:integer
rake db:migrate
于 2013-03-13T12:19:37.667 に答える