Debe agregar una tabla de combinación separada con solo un restaurant_idy user_id(sin clave principal), en orden alfabético .
Primero ejecute sus migraciones, luego edite el archivo de migración generado. 
Carriles 3
rails g migration create_restaurants_users_table
Carriles 4 :
rails g migration create_restaurants_users
Carriles 5
rails g migration CreateJoinTableRestaurantUser restaurants users
De los documentos :
  También hay un generador que producirá tablas de unión si JoinTable es parte del nombre:
Su archivo de migración (tenga en cuenta :id => false; es lo que impide la creación de una clave principal):
Carriles 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
Carriles 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_tocreará automáticamente los índices necesarios. def changedetectará automáticamente una migración hacia adelante o hacia atrás, sin necesidad de subir / bajar.
Carriles 5
create_join_table :restaurants, :users do |t|
  t.index [:restaurant_id, :user_id]
end
Nota: También hay una opción para un nombre de tabla personalizado que se puede pasar como un parámetro para llamar a create_join_table table_name. De los documentos
  De forma predeterminada, el nombre de la tabla de combinación proviene de la unión de los dos primeros argumentos proporcionados para create_join_table, en orden alfabético. Para personalizar el nombre de la tabla, proporcione una opción: table_name:
                 
                
restaurant_id. El segundo te ayudará si estás buscandouser_id. Si está buscando en ambos, creo que la base de datos sería lo suficientemente inteligente como para necesitar solo una. Así que supongo que el segundo realmente no necesita ser compuesto. Esto fue más como un ejemplo. Sin embargo, esta era una pregunta de Rails, por lo que la publicación en la sección DB arrojaría una respuesta más completa.rails g migration create_restaurants_userssin mesa al final.Las respuestas aquí están bastante anticuadas. A partir de Rails 4.0.2, sus migraciones utilizan
create_join_table.Para crear la migración, ejecute:
Esto generará lo siguiente:
Si desea indexar estas columnas, descomente las líneas respectivas y ¡listo!
fuente
unique: true. Esto evitará que se creen relaciones duplicadas.Al crear la tabla de combinación, preste especial atención al requisito de que las dos tablas se enumeren en orden alfabético en el nombre / clase de migración. Esto puede morderlo fácilmente si los nombres de sus modelos son similares, por ejemplo, "abc" y "abb". Si fueras a correr
Tus relaciones no funcionarán como se esperaba. Debes usar
en lugar.
fuente
Para las relaciones HABTM, debe crear una tabla de combinación. Solo hay una tabla de unión y esa tabla no debe tener una columna de identificación. Prueba esta migración.
Debe consultar los tutoriales de esta guía de rieles de relación
fuente