回答:
restaurant_id
and のみuser_id
(主キーなし)のアルファベット順で別の結合テーブルを追加する必要があります。
最初にマイグレーションを実行してから、生成されたマイグレーションファイルを編集します。
Rails 3
rails g migration create_restaurants_users_table
Rails 4:
rails g migration create_restaurants_users
Rails 5
rails g migration CreateJoinTableRestaurantUser restaurants users
ドキュメントから:
JoinTableが名前の一部である場合に結合テーブルを生成するジェネレータもあります。
移行ファイル(:id => false
主キーの作成を妨げているものに注意してください):
Rails 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
Rails 4
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
必要なインデックスを自動的に作成します。def change
フォワードまたはロールバック移行を自動検出します。アップ/ダウンの必要はありません。
Rails 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
注:create_join_tableというパラメーターとしてと呼ばれるカスタムテーブル名のオプションもありますtable_name
。ドキュメントから
デフォルトでは、結合テーブルの名前は、create_join_tableに提供された最初の2つの引数の和集合からアルファベット順に付けられます。テーブルの名前をカスタマイズするには、:table_nameオプションを指定します。
restaurant_id
。2番目は、で検索する場合に役立ちますuser_id
。両方を検索している場合、データベースは片方だけで十分なほどスマートだと思います。ですから、2つ目は実際に合成する必要はないと思います。これは単なる例ではありません。これはRailsの質問だったので、DBセクションに投稿すると、より完全な回答が得られます。
rails g migration create_restaurants_users
なしでなければなりません。
ここでの答えはかなり時代遅れです。Rails 4.0.2以降、移行ではを使用しcreate_join_table
ます。
移行を作成するには、次のコマンドを実行します。
rails g migration CreateJoinTableRestaurantsUsers restaurant user
これにより、以下が生成されます。
class CreateJoinTableRestaurantsUsers < ActiveRecord::Migration
def change
create_join_table :restaurants, :users do |t|
# t.index [:restaurant_id, :user_id]
# t.index [:user_id, :restaurant_id]
end
end
end
これらの列にインデックスを付ける場合は、それぞれの行のコメントを外してください。
unique: true
して追加します。これにより、重複した関係が作成されるのを防ぎます。
結合テーブルを作成するときは、2つのテーブルを移行名/クラスでアルファベット順にリストする必要があるという要件に注意してください。これは、モデル名が類似している場合、たとえば「abc」と「abb」のように簡単に噛み付く可能性があります。あなたが走るとしたら
rails g migration create_abc_abb_table
あなたの関係は期待どおりに機能しません。使用する必要があります
rails g migration create_abb_abc_table
代わりに。
HABTM関係の場合、結合テーブルを作成する必要があります。結合テーブルのみがあり、そのテーブルにはid列があってはなりません。この移行を試してください。
def self.up
create_table :restaurants_users, :id => false do |t|
t.integer :restaurant_id
t.integer :user_id
end
end
def self.down
drop_table :restaurants_users
end
この関係レールガイドのチュートリアルを確認する必要があります