您需要添加一个单独的连接表,其中只有一个restaurant_id 和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
来自docs:
还有一个生成器,如果 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。来自docs
默认情况下,连接表的名称来自
提供给 create_join_table 的前两个参数,按字母顺序排列
命令。要自定义表的名称,请提供 :table_name
选项: