es necesario agregar una tabla de unión separada con sólo una restaurant_id
y user_id
(sin clave primaria), en orden alfabético .
Primero ejecute sus migraciones, luego edite el archivo de migración generado.
Rails 3
rails g migration create_restaurants_users_table
Carriles 4:
rails g migration create_restaurants_users
Rieles 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Desde el docs:
También hay un generador que producirá unir tablas, si joinTable es parte del nombre:
Su archivo de migración (nótese el :id => false
; que es lo que impide la creación de una clave principal):
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
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.
rieles 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 personalizada que se puede pasar como parámetro a create_join_table llamada table_name
.Desde el docs
Por defecto, el nombre de la tabla de unión proviene de la unión de los dos primeros argumentos proporcionados a create_join_table, en orden alfabético orden. Para personalizar el nombre de la tabla, proporcionar una: nombre_tabla opción:
gracias esa solución funcionó perfectamente para mí. Cometí un simple error al usar este método, probé un rake db: migrate después del comando rails y no generó la tabla. Tuve que hacer un rake db: rollback, luego editar el archivo y luego rake db: migrar pero todo funciona ahora. – dbslone
@Dex: solo por curiosidad, ¿podría explicar por qué está utilizando un segundo índice compuesto, definido con orden de columnas invertidas? Tenía la impresión de que el orden de las columnas no importaba. No soy DBA, solo quiero ampliar mi propio entendimiento. ¡Gracias! – plainjimbo
@Jimbo No lo necesita así, realmente depende de sus consultas. Los índices se leen de izquierda a derecha, por lo que el primero será más rápido si está buscando 'restaurant_id'. El segundo ayudará si está buscando 'user_id'. Si está buscando en ambos, creo que la base de datos sería lo suficientemente inteligente como para necesitar una sola. Así que supongo que el segundo no necesita ser compuesto. Esto fue más que un simple ejemplo. Sin embargo, esta era una pregunta de Rails, por lo que publicar en la sección DB arrojaría una respuesta más completa. – Dex