Debe agregar una tabla de combinación separada con solo un restaurant_id
y 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_to
creará automáticamente los índices necesarios. def change
detectará 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_users
sin 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