through remove rails many has_and_belongs_to_many has example create column belongs and ruby-on-rails ruby-on-rails-3 migration has-and-belongs-to-many

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