ruby-on-rails - remove - rails migration
Rails has_and_belongs_to_many migration (4)
Al crear la tabla de unión, preste especial atención al requisito de que las dos tablas se enumeren en orden alfabético en el nombre / clase de la migración. Esto puede morder fácilmente si los nombres de sus modelos son similares, por ejemplo, "abc" y "abb". Si fueras a correr
rails g migration create_abc_abb_table
Tus relaciones no funcionarán como se espera. Debes usar
rails g migration create_abb_abc_table
en lugar.
Tengo dos modelos restaurant
y user
que quiero realizar una relación has_and_belongs_to_many.
Ya he has_and_belongs_to_many :restaurants
en los archivos modelo y has_and_belongs_to_many :restaurants
añadido has_and_belongs_to_many :restaurants
y has_and_belongs_to_many :users
Supongo que en este punto debería ser capaz de hacer algo como con Rails 3:
rails generate migration ....
pero todo lo que he intentado parece fallar. Estoy seguro de que esto es algo realmente simple. Soy nuevo en los rieles, así que todavía estoy aprendiendo.
Debe agregar una tabla de combinación separada con solo un restaurant_id
y user_id
(sin clave principal), en orden alfabético .
Primero ejecuta tus migraciones, luego edita el archivo de migración generado.
Carriles 3
rails g migration create_restaurants_users_table
Rails 4 :
rails g migration create_restaurants_users
Carriles 5
rails g migration CreateJoinTableRestaurantUser restaurants users
De los docs :
También hay un generador que producirá tablas de combinació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 create_join_table llamado table_name. De los docs
De forma predeterminada, 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. Para personalizar el nombre de la tabla, proporcione una opción: table_name:
Las respuestas aquí son bastante anticuadas. A partir de Rails 4.0.2, sus migraciones hacen uso de create_join_table
.
Para crear la migración, ejecuta:
rails g migration CreateJoinTableRestaurantsUsers restaurant user
Esto generará lo siguiente:
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
Si desea indexar estas columnas, elimine el comentario de las líneas respectivas y ¡ya está listo para comenzar!
Para las relaciones HABTM, necesita crear una tabla de unión. Solo hay una tabla de unión y esa tabla no debe tener una columna de identificación. Prueba esta migración
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
Debes consultar esta relación de guías de guías de rieles